我有一个df
,其中包含我的主要数据,其中有一百万rows
。我的主要数据还有30 columns
。现在,我想在名为df
的{{1}}中添加另一列。 category
是category
中的column
,其中包含大约700个df2
和另外两个rows
,与columns
中的columns
匹配}}
我首先在df
和index
中设置df2
,这些df
会在帧之间匹配,但index
中的某些df2
不会存在于df
。
df2
中的其余列名为AUTHOR_NAME
和CATEGORY
。
df
中的相关列称为AUTHOR_NAME
。
AUTHOR_NAME
中的某些df
在df2
中不存在,反之亦然。
我想要的说明是:当index
中的df
与index
中的df2
匹配且title
中的df
与{title
匹配时1}}在df2
中,将category
添加到df
,否则在category
中添加NaN。
示例数据:
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')
答案 0 :(得分:12)
考虑以下数据框MyWidget
和df
df2
选项1
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')
))
merge
选项2
df.merge(df2, how='left')
join
这两个选项都会产生
答案 1 :(得分:1)
方法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()
答案 2 :(得分:0)
虽然这里的其他答案为问题提供了非常优雅和优雅的解决方案,但我找到了一个资源,它既以非常优雅的方式回答了这个问题,又提供了一个非常清晰明了的例子来说明如何完成数据帧的连接/合并,有效地教授LEFT,RIGHT,INNER和OUTER连接。
Join And Merge Pandas Dataframe
老实说,在这个话题之后,任何进一步的寻求者都会想要检查他的例子......
答案 3 :(得分:-1)
您可以尝试以下方法。它将合并指定列上的两个数据集作为键。
expected_result = pd.merge(df, df2, on = 'CATEGORY', how = 'left')
答案 4 :(得分:-1)
尝试
df = df.combine_first(df2)