2015-10-06 55 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