2017-04-10 1 views
0

죄송합니다. 여기에 오기 위해 목표를 달성하는 방법을 Google에 표시 할 수 없습니다.groupby 팬더를 여러 개 사용하여 많은 플롯을 만드는 방법은 무엇입니까?

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가되어야합니다. 그리고 여기에 모드 2에 대해 평균이 Y이고 유사어가 (3,15)--(4,16) 인 두 라인 (3,(10+12)/2)--(4,(11+13)/2)을 얻고 싶습니다.

그러나이 코드는 작동하지 않습니다.

#!/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') 

답변

1

당신은 여기에 일반 팬더에서 할 수있는 하나 개의 방법이

import seaborn as sns 
sns.lmplot(data=df,hue='mode',x='X',y='Y',x_estimator=np.mean) 

같은 물건에 대한 많은 기능이있는 seaborn 패키지, 시도 할 수도 있습니다 :

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)) 
+0

죄송 플롯을 생성하지만 난 내 자신의 솔루션을 발견했습니다. 감사! –

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

1

나는이 작업을 수행하는 가장 쉬운 방법을 거라 생각은 pivot_table를 사용하는 것입니다.

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() 
당신이 팬더 통합 플로팅 기능을 사용하는 경우,

piv = pd.pivot_table(df, columns="mode", index="X") 
plt.plot(piv) 

또는 하나 :이 두 라인 전체를 감소

은 피벗 테이블을

로 인쇄합니다. 당신은 늦게 litte : 하지만 난 당신의 도움을 주셔서 감사합니다 ...

99,533,210 및

enter image description here

+0

좋아 보인다! 고마워, 나는 지금 그것을 염두에 둘 것이다. –

+0

"멋진 외모"대신 단순히 upvote 수 있습니다. – ImportanceOfBeingErnest

관련 문제