熊猫:绘制包含一列元组的数据框

jak*_*vdp 5 python matplotlib pandas

我有一个看起来像这样的非标准CSV文件:

x,y
1,"(5, 27, 4)"
2,"(3, 1, 6, 2)"
3,"(4, 5)"
Run Code Online (Sandbox Code Playgroud)

使用pd.read_csv()导致的结果并不是那么有用,因为元组没有被解析。有迹象表明,解决这个问题(一个现有的答案12),但由于这些元组具有异质性的长度,这些答案是不是我有问题是完全有益的。

我想做的是绘图xy使用熊猫绘图例程。天真的方法会导致错误,因为元组存储为字符串:

>>> # df = pd.read_csv('data.csv')
>>> df = pd.DataFrame({'x': [1, 2, 3],
                       'y': ["(5, 27, 4)","(3, 1, 6, 2)","(4, 5)"]})
>>> df.plot.scatter('x', 'y')
[...]
ValueError: scatter requires y column to be numeric
Run Code Online (Sandbox Code Playgroud)

我希望得到的结果是这样的:

import numpy as np
import matplotlib.pyplot as plt
for x, y in zip(df['x'], df['y']):
    y = eval(y)
    plt.scatter(x * np.ones_like(y), y, color='blue')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

通过转换数据框并使用df.plot.scatter()(最好不使用eval())直接从熊猫创建此图的简单方法吗?

Zer*_*ero 2

你可以爆炸dfplot

In [3129]: s = df.y.map(ast.literal_eval)

In [3130]: dff = pd.DataFrame({'x': df.x.repeat(s.str.len()).values,
                               'y': np.concatenate(s.values)})

In [3131]: dff
Out[3131]:
   x   y
0  1   5
1  1  27
2  1   4
3  2   3
4  2   1
5  2   6
6  2   2
7  3   4
8  3   5
Run Code Online (Sandbox Code Playgroud)

并且,情节

dff.plot.scatter('x', 'y')
Run Code Online (Sandbox Code Playgroud)