基于多个数据框列值的数据框列的值

时间:2020-01-21 20:03:34

标签: python dataframe for-loop

我有两个数据框:

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().

尽管我想纠正此错误,但我怀疑可能会有更好,更有效的方法来完成我要尝试的操作。

1 个答案:

答案 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'])