我有两个数据框:
df_one:
person year job
AA 2010 x
AA 2013 y
AA 2014 z
BG 2009 a
BG 2010 b
HJ 2001 c
HJ 2002 g
df_two:
person year city
AA 2010 NY
YH 2004 Minneapolis
AA 2013 Boston
AA 2014 LA
BG 2009 Chicago
IS 1998 Chicago
BG 2010 Des Moines
HJ 2001 Austin
HJ 2002 Nashville
df_one和df_two有很多相同的人。因为df_one具有“职位”列,所以我想根据人员和年份列将“城市”列从df_two迁移到df_one中的适当人员。为了找到正确的人和年份(以及正确的城市),我尝试了以下操作(以便在df_one上创建一个名为“ city”的新列):
for i,row in df_one.iterrows():
person = df_one.at[i,'person']
year = df_one.at[i,'year']
if df_one.loc[(df_two['person'] == person) & (df_two['year'] == year)]:
df_one.at[i,'city'] = df_two['city']
我遇到了错误:
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
尽管我想纠正此错误,但我怀疑可能会有更好,更有效的方法来完成我要尝试的操作。
答案 0 :(得分:1)
在这种情况下,您应该使用.loc
子集数据并将其保存到变量中,如下所示:
# make sure to add an empty column
df_one['city'] = None
for i,row in df_one.iterrows():
person = df_one.at[i,'person']
year = df_one.at[i,'year']
f = df_two.loc[(df_two['person'] == person) & (df_two['year'] == year), 'city']
print(f)
if not f.empty:
df_one.at[i,'city'] = f.values[0]
但是,执行此操作的最佳方法是在熊猫中使用merge
函数。您可以轻松做到:
df_one.merge(df_two, on=['person','year'])