如何使用乘法组合熊猫制作许多情节?

时间:2017-04-10 22:42:42

标签: python pandas matplotlib

抱歉,我无法谷歌如何实现我的目标,所以我在这里。

查看一些沙盒数据表:

   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')

3 个答案:

答案 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

并创建情节

enter image description here

答案 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')

enter image description here