[英]Pandas populate new dataframe column based on matching columns in another dataframe
我有一个df
,其中包含我的主要数据,其中有一百万rows
。 我的主要数据也有 30 columns
。 现在我想向我的df
添加另一列,名为category
。 该category
是df2
中的一column
,其中包含大约 700 rows
和另外两columns
,这些columns
将与df
两columns
匹配。
我首先设置一个index
在df2
和df
,将帧之间的匹配,但是部分的index
中df2
不存在df
。
df2
中的其余列称为AUTHOR_NAME
和CATEGORY
。
df
的相关列称为AUTHOR_NAME
。
df
中的某些AUTHOR_NAME
在df2
中不存在,反之亦然。
我要的指令是:当index
在df
用火柴index
在df2
和title
在df
与比赛title
的df2
,添加category
到df
,否则在加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')
考虑以下数据帧df
和df2
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
并删除Index
和AUTHOR_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连接。
老实说,在这个话题之后,任何进一步的寻求者都会想要检查他的例子......
您可以尝试以下方法。 它会将指定列上的两个数据集合并为键。
expected_result = pd.merge(df, df2, on = 'CATEGORY', how = 'left')
尝试
df = df.combine_first(df2)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.