
[英]add empty column to existing DataFrame and populate it with a for loop
[英]Add column to DataFrame in a loop
假设我有一个非常简单的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
使用merge
, concat
或join
,我似乎只能为循环的每次迭代创建一个新列,并用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: []
第二次编辑: @WB,以下内容似乎可行,但不可能没有使用适当的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
好的,因为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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.