2016-07-21 223 views
1

我有兩個數據幀,看起來像這樣合併兩個數據幀多個值

DF1

   name ID  abb 
    0   foo 251803 I 
    1   bar 376811 R 
    2   baz 174254 Q 
    3  foofoo 337144 IRQ 
    4  barbar 306521 IQ 

DF2

  abb comment 
    0  I  fine 
    1  R  repeat 
    2  Q  other 

我試圖用熊貓merge加入兩個數據框,並簡單地分配comment列第二數據幀至基於以下面的方式將abb列中的第:

df1.merge(df2, how='inner', on='abb') 

導致:

   name ID  abb comment 
    0   foo 251803 I  fine 
    1   bar 376811 R  repeat 
    2   baz 174254 Q  other 

這非常適用於在abb的唯一一個字母標識符。但是,它顯然失敗了一個以上的角色。

我試圖在第一個數據幀的abb列上使用list,但這會導致KeyError

我想要做的是以下幾點。

1)單獨含有在此列中一個以上的字符的行分成若干行

2)合併數據幀

3)任選地:聯合再次行

回答

2

使用join

print (df1) 
    name  ID abb 
0  foo 251803 I 
1  bar 376811 R 
2  baz 174254 Q 
3 foofoo 337144 IRQ 
4 barbar 306521 IQ 

#each character to df, which is stacked to Series 
s = df1.abb.apply(lambda x: pd.Series(list(x))) 
      .stack() 
      .reset_index(drop=True, level=1) 
      .rename('abb') 
print (s) 
0 I 
1 R 
2 Q 
3 I 
3 R 
3 Q 
4 I 
4 Q 
Name: abb, dtype: object 

df1 = df1.drop('abb', axis=1).join(s) 
print (df1) 
    name  ID abb 
0  foo 251803 I 
1  bar 376811 R 
2  baz 174254 Q 
3 foofoo 337144 I 
3 foofoo 337144 R 
3 foofoo 337144 Q 
4 barbar 306521 I 
4 barbar 306521 Q 
+0

列來作爲我上面列出。所以我不需要加入他們。但是,我不能在'IRQ'上使用分割來將字符串分成'I','R'和'Q'來使用堆棧來獲得三列。 – Fourier

+0

對不起,請參閱編輯。 – jezrael

+0

非常有見地的答案。非常感謝你。我已經列出了名單,但沒有使用這裏的帽子戲法。 – Fourier

1

看到這個answer爲各種方式爆炸在列

rows = [] 
for i, row in df1.iterrows(): 
    for a in row.abb: 
     rows.append([row['ID'], a, row['name']]) 

df11 = pd.DataFrame(rows, columns=df1.columns) 

df11.merge(df2) 

enter image description here

+0

看着你原來的答案,這可能比上述解決方案稍快一點@piRSquared – Fourier