2015-10-06 57 views
3

添加列,每一行我有蟒蛇大熊貓不同長度的兩個dataframes這樣的:按行長度不同行的兩個dataframes比較和同等價值

df1:         df2: 

     Column1 Column2 Column3   ColumnA ColumnB 
    0 1  a  r    0 1  a 
    1 2  b  u    1 1  d 
    2 3  c  k    2 1  e 
    3 4  d  j    3 2  r 
    4 5  e  f    4 2  w 
             5 3  y 
             6 3  h 

什麼我想現在要做的就是比較df1的Column1和df2的ColumnA。對於每個「hit」,其中df2中的ColumnA中的行與df1中的Column1中的行具有相同的值,我想將df1的列添加到df1中,並且df2的值ColumnB具有找到「hit」的行,讓我的結果是這樣的:

df1: 

    Column1 Column2 Column3 Column4 Column5 Column6 
0  1  a  r  a  d  e 
1  2  b  u  r  w 
2  3  c  k  y  h 
3  4  d  j 
4  5  e  f 

我迄今試圖爲:

for row in df1, df2: 
    if df1[Column1] == df2[ColumnA]: 
     print 'yey!' 

這給了我一個錯誤說我不能比較不同長度的兩個dataframes。所以,我想:

for row in df1, df2: 
    if def2[def2['ColumnA'].isin(def1['column1'])]: 
     print 'lalala' 
    else: 
     print 'Nope' 

其中「作品」中,我得到的輸出,但我不認爲它遍歷行並對它們進行比較而言,因爲它只打印「LALALA」兩次。於是我研究了一些,並找到一種方法來遍歷數據幀中的每一行,這就是:

for index, row in df1.iterrows(): 
    print row['Column1] 

但我不知道怎麼用它來比較兩個dataframes的列,並得到輸出I慾望。

任何有關如何做到這一點的幫助將非常感激。

回答

3

我建議你使用數據幀API,它允許在join, merge方面與DF操作,groupby等,您可以在下面找到我的解決方案:

import pandas as pd 

df1 = pd.DataFrame({'Column1': [1,2,3,4,5], 
    'Column2': ['a','b','c','d','e'], 
    'Column3': ['r','u','k','j','f']}) 

df2 = pd.DataFrame({'Column1': [1,1,1,2,2,3,3], 'ColumnB': ['a','d','e','r','w','y','h']}) 

dfs = pd.DataFrame({}) 
for name, group in df2.groupby('Column1'): 
    buffer_df = pd.DataFrame({'Column1': group['Column1'][:1]}) 
    i = 0 
    for index, value in group['ColumnB'].iteritems(): 
     i += 1 
     string = 'Column_' + str(i) 
     buffer_df[string] = value 

    dfs = dfs.append(buffer_df) 

result = pd.merge(df1, dfs, how='left', on='Column1') 
print(result) 

結果是:

Column1 Column2 Column3 Column_0 Column_1 Column_2 
0  1  a  r  a  d  e 
1  2  b  u  r  w  NaN 
2  3  c  k  y  h  NaN 
3  4  d  j  NaN  NaN  NaN 
4  5  e  f  NaN  NaN  NaN 

Ps更多細節:

1)對於df2我生產'Column1'。單個的是一個數據幀。下面的實施例:

Column1 ColumnB 
0  1  a 
1  1  d 
2  1  e 

2)爲每個我產生數據幀buffer_df:後

Column1 Column_0 Column_1 Column_2 
0  1  a  d  e 

3)I創建DF DFS

Column1 Column_0 Column_1 Column_2 
0  1  a  d  e 
3  2  r  w  NaN 
5  3  y  h  NaN 

4)最後我執行左連接爲df1dfs獲得需要的結果。

2)* buffer_df迭代產生:

step0 (buffer_df = pd.DataFrame({'Column1': group['Column1'][:1]})): 
      Column1 
     5  3 

step1 (buffer_df['Column_0'] = group['ColumnB'][5]):  
      Column1 Column_0 
     5  3  y 

step2 (buffer_df['Column_1'] = group['ColumnB'][5]):  
      Column1 Column_0 Column_1 
     5  3  y  h 
+0

謝謝你,非常簡潔答案!但是我注意到,我不太清楚你從buffer_df = ....到dfs = dfs.append(buffer_df)所做的事情。你能解釋一下代碼的作用嗎?謝謝! –

+0

實際上,我認爲我得到了單行代碼的功能,但我不明白它們如何一起創建輸出... –

+0

@sequence_hard再次檢查我的答案:添加新的細節。你的過程變得更清楚了嗎? – Gregg