循环将列添加到DataFrame

时间:2019-01-28 17:26:29

标签: python pandas dataframe

假设我有一个非常简单的pandas数据框,其中包含一个带有“初始值”的索引列。我想循环读取N个其他数据框,以填充具有匹配索引的单个“比较”列。

例如,我的初始数据框为

   Initial
0        a
1        b
2        c
3        d

和以下两个数据框以循环读取

   Comparison
0           e
1           f
   Comparison
2           g
3           h
4           i  <= note that this index doesn't exist in Initial so won't be matched

我想产生以下结果

    Initial Comparison
0        a           e
1        b           f
2        c           g
3        d           h

使用mergeconcatjoin,我似乎只能为循环的每次迭代创建一个新列,用NaN填充空白

实现此目标的最熊猫方式的方法是什么?


在提出的重复解决方案中举一个例子:

import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.array([['a'],['b'],['c'],['d']]), columns=['Initial'])
print df1
df2 = pd.DataFrame(np.array([['e'],['f']]), columns=['Compare'])
print df2
df3 = pd.DataFrame(np.array([[2,'g'],[3,'h'],[4,'i']]), columns=['','Compare'])
df3 = df3.set_index('')
print df3
print df1.merge(df2,left_index=True,right_index=True).merge(df3,left_index=True,right_index=True)
>>
      Initial
0       a
1       b
2       c
3       d
  Compare
0       e
1       f
  Compare

2       g
3       h
4       i
Empty DataFrame
Columns: [Initial, Compare_x, Compare_y]
Index: []

第二次编辑: @ W-B,下面的方法似乎有用,但是不可能没有使用适当的pandas方法的简单选择。它还需要关闭警告,这可能很危险...

pd.options.mode.chained_assignment = None
df1["Compare"]=pd.Series()
for ind in df1.index.values:
    if ind in df2.index.values:
        df1["Compare"][ind]=df2.T[ind]["Compare"]
    if ind in df3.index.values:
        df1["Compare"][ind]=df3.T[ind]["Compare"]
print df1
>>
      Initial Compare
0           a       e
1           b       f
2           c       g
3           d       h

1 个答案:

答案 0 :(得分:1)

好,因为Op需要更多信息


数据输入

import functools
df1 = pd.DataFrame(np.array([['a'],['b'],['c'],['d']]), columns=['Initial'])
df1['Compare']=np.nan
df2 = pd.DataFrame(np.array([['e'],['f']]), columns=['Compare'])
df3 = pd.DataFrame(np.array(['g','h','i']), columns=['Compare'],index=[2,3,4])

解决方案

newdf=functools.reduce(lambda x,y: x.fillna(y),[df1,df2,df3])
newdf
Out[639]: 
  Initial Compare
0       a       e
1       b       f
2       c       g
3       d       h