2017-04-23 87 views
2

我改寫我的問題。我在尋找以下問題的解決方案:熊貓 - 如何合併兩個數據幀

我有一個像數據幀:

Sp Mt Value count 
4 MM2 S4 bg  10 
5 MM2 S4 dgd 1 
6 MM4 S2 rd  2 
7 MM4 S2 cb  8 
8 MM4 S2 uyi 8 

另據幀像:

Sp Mt Value count 
4 MM2 S4 bg  9 
5 MM2 S4 dgd 10 
6 MM4 S2 rd  21 
7 MM4 S2 cb  8 
8 MM4 S2 uyi 8 

我想合併這兩個名字:

Sp Mt Value count 
4 MM2 S4 bg [10,9] 
5 MM2 S4 dgd [1,10] 
6 MM4 S2 rd [2,21] 
7 MM4 S2 cb [8,8] 
8 MM4 S2 uyi [8,8] 
+0

是指數總是要排隊這樣呢? – pshep123

回答

2

使用merge(默認inner join)或concat(默認outer join)加入兩個首先。然後,通過drop創造新的一列和最後刪除不必要的列:

df = pd.merge(df1, df2, on = ['Sp','Mt','Value']) 
df['count'] = df.filter(like='count').values.tolist() 
df = df.drop(['count_x','count_y'], axis=1) 
print (df) 
    Sp Mt Value count 
0 MM2 S4 bg [10, 9] 
1 MM2 S4 dgd [1, 10] 
2 MM4 S2 rd [2, 21] 
3 MM4 S2 cb [8, 8] 
4 MM4 S2 uyi [8, 8] 

cols = ['Sp','Mt','Value'] 
df = pd.concat([df1.set_index(cols)['count'], 
       df2.set_index(cols)['count']],axis=1, keys=('count','a')) 
df['count'] = df[['count','a']].values.tolist() 
df = df.drop('a', axis=1).reset_index() 
print (df) 
    Sp Mt Value count 
0 MM2 S4 bg [10, 9] 
1 MM2 S4 dgd [1, 10] 
2 MM4 S2 rd [2, 21] 
3 MM4 S2 cb [8, 8] 
4 MM4 S2 uyi [8, 8] 
+0

非常感謝您的解決方案! – user2890059

+0

第一種過濾方法,如何關注values.tolist是[df1.count,df2.count]不是[df2.count,df1.count] – user2890059

+0

您是否認爲通過交換'df1'和'df2'的變更順序由'pd .merge(df2,df1,...'? – jezrael

0
frames=[df1,df2] 
df3=pd.concat(frames) 

df_merged_agg=df3.groupby(['Sp','Mt','Value']).agg({'count': lambda x: ','.join(x)}).reset_index() 

結果將是:

Sp Mt Value count 
0 MM2 S4 bg 10,9 
1 MM2 S4 dgb 1,10 
2 MM4 S2 cb 8,8 
3 MM4 S2 rd 2,21 
4 MM4 S2 uyi 8,8 

要獲得元組總比分領域:

df_merged_agg=df3.groupby(['Sp','Mt','Value']).agg(lambda x: tuple(x)).reset_index() 
0

使用pd.Series.addlist

icol = ['Sp', 'Mt', 'Value'] 
d1 = df1.set_index(icol)['count'] 
d2 = df2.set_index(icol)['count'] 

(d1.apply(lambda x: [x]) + d2.apply(lambda x: [x])).reset_index() 

    Sp Mt Value count 
0 MM2 S4 bg [10, 9] 
1 MM2 S4 dgd [1, 10] 
2 MM4 S2 rd [2, 21] 
3 MM4 S2 cb [8, 8] 
4 MM4 S2 uyi [8, 8] 
+1

@Claudio [** see this **](http://stackoverflow.com/tags/pandas/topusers) – piRSquared

+1

@Claudio 803是upvotes減去downvotes的數量。是回答的問題數量 – piRSquared