抱歉,我无法谷歌如何实现我的目标,所以我在这里。
查看一些沙盒数据表:
mode X Y
0 1 3 10
1 1 4 11
2 1 3 12
3 1 4 13
4 2 3 14
5 2 4 15
6 2 3 16
7 2 4 17
我创建了以下沙箱代码。所以在这里,我希望绘制两条对应于两种不同模式的线条('模式1'和'模式2')。 X轴应为3,4。在这里,我想为模式1获得两行(3,(10+12)/2)--(4,(11+13)/2)
,其中模式2为平均Y和类似(3,15)--(4,16)
。
但是这段代码甚至不起作用。
#!/usr/bin/python3
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame([[1,1,1,1,2,2,2,2],[3,4,3,4,3,4,3,4],list(range(10,18))]).T
df.columns = ['mode','X','Y']
mode = df.groupby(['mode'])['mode'].mean()
Ox = df.groupby(['X'])['X'].mean()
Oy = df.groupby(['mode','X'])['Y'].mean()
for x in mode:
plt.plot(Ox, Oy[Oy['mode'== x]] , label = 'test' + x)
plt.savefig('testpandas.pdf')
答案 0 :(得分:1)
你可能想尝试seaborn包,它有很多这样的功能
import seaborn as sns
sns.lmplot(data=df,hue='mode',x='X',y='Y',x_estimator=np.mean)
这是在普通大熊猫中实现这一目标的一种方法:
y_means=df.groupby(['mode','X'],as_index=False).mean()
for mode,g in y_means.groupby('mode'):
plt.plot(g['X'],g['Y'],'o-',label = 'mode = ' + str(mode))
答案 1 :(得分:1)
我猜最简单的方法是使用pivot_table
。这将整个事情减少到两行:
piv = pd.pivot_table(df, columns="mode", index="X")
plt.plot(piv)
甚至只有一个,如果您使用pandas集成绘图功能:
pd.pivot_table(df, columns="mode", index="X").plot()
<小时/> 使用matplotlib的完整解决方案:
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame([[1,1,1,1,2,2,2,2],[3,4,3,4,3,4,3,4],list(range(10,18))]).T
df.columns = ['mode','X','Y']
piv = pd.pivot_table(df, columns="mode", index="X")
print piv
plt.plot(piv)
plt.legend(labels=["mode {}".format(c[1]) for c in piv.columns.values])
plt.show()
将数据透视表打印为
Y
mode 1 2
X
3 11 15
4 12 16
并创建情节
答案 2 :(得分:0)
这是问人的答案。
其实我自己找到了解决方案。
#!/usr/bin/python3
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame([[1,1,1,1,2,2,2,2],[3,4,3,4,3,4,3,4],list(range(10,18))]).T
df.columns = ['mode','X','Y']
mode = df.groupby(['mode'])['mode'].mean()
Ox = df.groupby(['X'])['X'].mean()
Oy = df.groupby(['mode','X'])['Y'].mean()
for x in mode:
plt.plot(Ox, Oy[mode[x]] , label = 'test' + str(x))
plt.savefig('testpandas.png')