使用条件列绘制 Pandas 数据框图表

11

我有这种pandas.DataFrame。"a",“b”是获取“x”和“y”的条件。

df = pd.DataFrame([[10,20,0,.1], [10,20,1,.5], [100,200,0,.33], [100,200,1,.11]], columns=["a", "b", "x", "y"])
df

enter image description here

我需要根据相同条件绘制(x,y)列的线图。期望的结果如下图所示:

enter image description here enter image description here

当然,这幅图是由以下代码手动生成的:

pd.DataFrame([[0,.1],[1,.5]]).plot(kind="line", x=0, y=1, style="-", legend=None, title="a: 10, b: 20")
plt.xlabel("x")
plt.ylabel("y")
plt.figure()
pd.DataFrame([[0,.33],[1,.11]]).plot(kind="line", x=0, y=1, style="-", legend=None, title="a: 100, b: 200")
plt.xlabel("x")
plt.ylabel("y")

我的问题是如何在获取包括条件列、X和Y的数据帧时动态地制作上述图形。

更新

列名是固定的。但是,条件列的值是动态变化的。因此,我不能使用值10、20、100、200。

更新2

如果我有下面的“filter_with_a_and_b”方法,我认为问题就解决了:

def filter_with_a_and_b(df, a_b):
    # how to implement?

a_b_list = df.drop_duplicates(["a","b"])
new_df_list = filter_with_a_and_b(df, a_b)
for idx, df in enumerate(new_df_list):
    df.plot(title=a_b_list[idx])

你的条件来源是什么,你想在哪些列上应用这些条件? - MaxU - stand with Ukraine
@MaxU 请查看更新2。 - Light Yagmi
所以你想用列ab的值来过滤列ab,这样会产生相同的数据框 - 这是你想要的吗?;) - MaxU - stand with Ukraine
你只是想为所有唯一的(a, b)组合绘制(x, y)图吗?也就是说,如果你有三个不同的(a,b)组合,那么会产生三个相应的(x,y)图 - 我理解得对吗? - MaxU - stand with Ukraine
@MaxU 是的!绝对没问题。 - Light Yagmi
我已经更新了我的答案,请查看。 - MaxU - stand with Ukraine
1个回答

16

这是你想要的吗?

df.loc[(df.a == 10) & (df.b == 20), ['x','y']].plot(title='a: 10, b: 20')

现在让我们以更智能的方式做到它:

cond = {'a': 100, 'b': 200}
df.loc[(df.a == cond['a']) & (df.b == cond['b']), ['x','y']].plot(title='a: {a}, b: {b}'.format(**cond))

或使用 query()

q = 'a == 100 and b == 200'
df.query(q)[['x','y']].plot(title=q)

更新:

a_b_list = df[['a','b']].drop_duplicates()

[df.loc[(df.a == tup[0]) & (df.b == tup[1]), ['x','y']] \
   .plot(x='x', y='y', kind='line', style='-',title='a: {0[0]}, b: {0[1]}'.format(tup)) \
   .set_ylabel('y')
 for tup in a_b_list.itertuples(index=False)]

@MaxU 抱歉,我的意思是条件值应该动态更改。 - Light Yagmi
1
@rkjt50r983,你想如何动态地改变它们?你能举个例子吗? - MaxU - stand with Ukraine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接