繁体   English   中英

Pandas 根据另一个数据框中的匹配列填充新的数据框列

[英]Pandas populate new dataframe column based on matching columns in another dataframe

我有一个df ,其中包含我的主要数据,其中有一百万rows 我的主要数据也有 30 columns 现在我想向我的df添加另一列,名为category categorydf2中的一column ,其中包含大约 700 rows和另外两columns ,这些columns将与dfcolumns匹配。

我首先设置一个indexdf2df ,将帧之间的匹配,但是部分的indexdf2不存在df

df2中的其余列称为AUTHOR_NAMECATEGORY

df的相关列称为AUTHOR_NAME

df中的某些AUTHOR_NAMEdf2中不存在,反之亦然。

我要的指令是:当indexdf用火柴indexdf2titledf与比赛titledf2 ,添加categorydf ,否则在加NaN的category

示例数据:

df2
           AUTHOR_NAME              CATEGORY
Index       
Pub1        author1                 main
Pub2        author1                 main
Pub3        author1                 main
Pub1        author2                 sub
Pub3        author2                 sub
Pub2        author4                 sub


df
            AUTHOR_NAME     ...n amount of other columns        
Index       
Pub1        author1                 
Pub2        author1     
Pub1        author2 
Pub1        author3
Pub2        author4 

expected_result
            AUTHOR_NAME             CATEGORY   ...n amount of other columns
Index
Pub1        author1                 main
Pub2        author1                 main
Pub1        author2                 sub
Pub1        author3                 NaN
Pub2        author4                 sub

如果我使用df2.merge(df,left_index=True,right_index=True,how='left', on=['AUTHOR_NAME'])我的df会比预期的大三倍。

所以我想也许合并是解决这个问题的错误方法。 我真正想做的是使用df2作为查找表,然后根据是否满足某些条件将type值返回给df

def calculate_category(df2, d):
    category_row = df2[(df2["Index"] == d["Index"]) & (df2["AUTHOR_NAME"] == d["AUTHOR_NAME"])]
    return str(category_row['CATEGORY'].iat[0])

df.apply(lambda d: calculate_category(df2, d), axis=1)

但是,这给我带来了一个错误:

IndexError: ('index out of bounds', u'occurred at index 7614')

考虑以下数据帧dfdf2

df = pd.DataFrame(dict(
        AUTHOR_NAME=list('AAABBCCCCDEEFGG'),
        title=      list('zyxwvutsrqponml')
    ))

df2 = pd.DataFrame(dict(
        AUTHOR_NAME=list('AABCCEGG'),
        title      =list('zwvtrpml'),
        CATEGORY   =list('11223344')
    ))

选项1
merge

df.merge(df2, how='left')

选项2
join

cols = ['AUTHOR_NAME', 'title']
df.join(df2.set_index(cols), on=cols)

两种选择都会产生

在此输入图像描述

方法1:

您可以改为使用concat并删除IndexAUTHOR_NAME列中存在的重复值。 之后,使用isin检查成员资格:

df_concat = pd.concat([df2, df]).reset_index().drop_duplicates(['Index', 'AUTHOR_NAME'])
df_concat.set_index('Index', inplace=True)
df_concat[df_concat.index.isin(df.index)]

图片

注意:假设列Index被设置为两个DF's索引列。


方法2:

正确设置索引列后使用join ,如下所示:

df2.set_index(['Index', 'AUTHOR_NAME'], inplace=True)
df.set_index(['Index', 'AUTHOR_NAME'], inplace=True)

df.join(df2).reset_index()

图片

虽然这里的其他答案为问题提供了非常好的和优雅的解决方案,但我找到了一个资源,它既以非常优雅的方式回答了这个问题,又提供了一个关于如何完成连接的一个非常清晰和简单的例子/合并数据帧,有效地教授LEFT,RIGHT,INNER和OUTER连接。

加入并合并Pandas Dataframe

老实说,在这个话题之后,任何进一步的寻求者都会想要检查他的例子......

您可以尝试以下方法。 它会将指定列上的两个数据集合并为键。

expected_result = pd.merge(df, df2, on = 'CATEGORY', how = 'left')

尝试

df = df.combine_first(df2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM