我正在使用组合的ID1和ID2列绘制线条。在.csv文件中,ID1和ID2号码可能会在某个时刻重复出现。当ID2 = 0时,确定数据是否需要是新行的方法是直接跟随的。我希望程序将下面提供的样本数据识别为2个单独的行。
ID1 ID2 x y
1 2 1 1
1 2 2 2
1 2 3 3
1 2 4 4
1 0 5 5
...
1 2 1 3
1 2 2 5
1 2 3 7
现在,我的程序会将此数据绘制为相同颜色的连续线。我需要一个不同颜色的新行,但即使ID1和ID2值重复,我也无法弄清楚如何过滤数据以开始新行。该计划需要看到' 0' 0在ID2列中作为开始新行的信号。任何想法都会非常有用。
答案 0 :(得分:2)
一个选项是找出零的indizes并循环它们以创建单独的DataFrames来绘制。
u = u"""ID1 ID2 x y
1 2 1 1
1 2 2 2
1 2 3 3
1 2 4 4
1 0 5 5
1 2 1 3
1 2 2 5
1 2 3 7
1 0 1 3
1 2 2 4
1 2 3 2
1 2 4 1"""
import io
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_csv(io.StringIO(u), delim_whitespace=True)
fig, ax = plt.subplots()
inx = list(np.where(df["ID2"].values==0)[0]+1)
inx = [0] + inx + [len(df)]
for i in range(len(inx)-1):
dff = df.iloc[inx[i]:inx[i+1],:]
dff.plot(x="x", y="y", ax=ax, label="Label {}".format(i))
plt.show()
答案 1 :(得分:1)
您可以采用的方法是cumsum
和seaborn
使用hue
进行绘图:
temp_df = df.assign(line_no=df.ID2.eq(0).cumsum()).query('ID2 != 0')
import seaborn as sns
_ = sns.pointplot(x='x',y='y', hue='line_no',data=temp_df)
或使用matplotlib:
fig,ax = plt.subplots()
for i in temp_df.line_no.unique():
x=temp_df.query('line_no == @i')['x']
y=temp_df.query('line_no == @i')['y']
ax.plot(x,y)