我有一个434300行的pandas数据帧,结构如下:
x y p1 p2
1 8.0 1.23e-6 10 12
2 7.9 4.93e-6 10 12
3 7.8 7.10e-6 10 12
...
.
...
4576 8.0 8.85e-6 5 16
4577 7.9 2.95e-6 5 16
4778 7.8 3.66e-6 5 16
...
...
...
434300 ...
关键点是对于变化的x,y数据的每个块,存在不变化的p1和p2 。请注意,这些常量p1,p2的块具有不同的长度,因此不仅仅是每隔 n 行切片数据的问题。
我想在图表中绘制值p1和p2,但只想绘制唯一的点。
如果我使用:
绘制p1和p2In [1]: fig=plt.figure()
In [2]: ax=plt.subplot(111)
In [3]: ax.plot(df['p1'],df['p2'])
In [4]: len(ax.lines[0].get_xdata())
Out[4]: 434300
我看到matplotlib正在绘制每个单独的数据行。
仅绘制p1和p2列的唯一点的最佳方法是什么?
Here是一个小示例数据集的csv,它包含我的数据集的所有重要功能。
答案 0 :(得分:2)
只需删除重复项并绘制:
df.drop_duplicates(how='all', columns=['p1', 'p2'])[['p1', 'p2]].plot()
答案 1 :(得分:2)
您可以从数据框中对p1
和p2
列进行切片,然后在绘图之前删除重复项。
sub_df = df[['p1','p2']].drop_duplicates()
fig, ax = plt.subplots(1,1)
ax.plot(sub_df['p1'],sub_df['p2'])
答案 2 :(得分:2)
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('exampleData.csv')
d = data[['p1', 'p2']].drop_duplicates()
plt.plot(d['p1'], d['p2'], 'o')
plt.show()
答案 3 :(得分:1)
在查看R中类似问题的this答案后(这是大熊猫数据框的基础)我找到了pandas函数pandas.Dataframe.drop_duplicates
。如果我们修改我的示例代码如下:
In [1]: fig=plt.figure()
In [2]: ax=plt.subplot(111)
In [3]: df.drop_duplicates(subset=['p1','p2'],inplace=True)
In [3]: ax.plot(df['p1'],df['p2'])
In [4]: len(ax.lines[0].get_xdata())
Out[4]: 15
我们发现这会将df限制为仅绘制的唯一点。重要的一点是,您必须将子集传递给drop_duplicates
,以便它仅使用这些列来确定重复的行。