Python 熊猫基于另一个数据帧中的匹配列填充新的数据帧列
我有一个Python 熊猫基于另一个数据帧中的匹配列填充新的数据帧列,python,pandas,merge,populate,Python,Pandas,Merge,Populate,我有一个df,其中包含我的主数据,有一百万行。我的主要数据也有30个列。现在我想在我的df中添加另一列,名为category。类别是df2中的列,其中包含约700行和另外两列与df中的两列相匹配 我首先在df2和df中设置一个将在帧之间匹配的索引,但是df2中的一些索引在df中不存在 df2中的其余列称为AUTHOR\u NAME和CATEGORY df中的相关列称为AUTHOR\u NAME df中的一些AUTHOR\u NAME在df2中不存在,反之亦然 我想要的指令是:当df中的index
df
,其中包含我的主数据,有一百万行。我的主要数据也有30个列
。现在我想在我的df
中添加另一列,名为category
。类别
是df2
中的列
,其中包含约700行
和另外两列与df
中的两列相匹配
我首先在df2
和df
中设置一个将在帧之间匹配的索引,但是df2
中的一些索引在df
中不存在
df2
中的其余列称为AUTHOR\u NAME
和CATEGORY
df
中的相关列称为AUTHOR\u NAME
df
中的一些AUTHOR\u NAME
在df2
中不存在,反之亦然
我想要的指令是:当df
中的index
与df2
中的index
匹配,并且df
中的title
与df2
中的title
匹配时,将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\u index=True,right\u index=True,how='left',on=['AUTHOR\u 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')
方法1:
您可以改为使用并删除索引
和作者姓名
列中的重复值。之后,用于检查成员资格:
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)]
注意:索引列
被假定为DF的索引列
方法2:
正确设置索引列后使用,如图所示:
df2.set_index(['Index', 'AUTHOR_NAME'], inplace=True)
df.set_index(['Index', 'AUTHOR_NAME'], inplace=True)
df.join(df2).reset_index()
考虑以下数据帧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
合并
df.merge(df2, how='left')
选项2
加入
cols = ['AUTHOR_NAME', 'title']
df.join(df2.set_index(cols), on=cols)
两种选择都会产生收益
虽然这里的其他答案为所问问题提供了非常好且优雅的解决方案,但我发现了一个资源,它既以极其优雅的方式回答了这个问题,又提供了一组非常清晰和直接的示例,说明如何完成数据帧的连接/合并,有效地教授左、右、,内部和外部连接
老实说,我觉得在本主题之后,任何进一步的寻求者都会想看看他的例子……您可以尝试以下内容。它将合并指定列上的两个数据集作为键
expected_result = pd.merge(df, df2, on = 'CATEGORY', how = 'left')
我不确定on
和left\u index/right\u index
是否一起工作。也许你需要on=['Index','AUTHOR\u NAME']
(或者类似的东西)。我不确定哪个数据帧留在df2.merge(df,…)
中。也许你需要how=“right”
或pd.merge(left=df,right=df2,…)
不过,它对我来说很有用。您是否为DFs
使用了适当的名称,并且两个框架中的索引
列是否都设置为索引?请仔细检查。让我用你设置的名称编辑这篇文章。是的,两个框架中的Index
列都被设置为索引,我使用了DFs
的适当名称只是一个简短的说明。。这对我很管用。。但在某些情况下,我最终得到了复制品。。还是不确定是什么原因。。但是无论如何,删除只保留一个(keep=first或keep=last)的重复项。。检查此处的文档,如您对以前答案的评论中所指出的,请提供答案的进一步上下文并正确设置格式。否则,由于质量低劣,必须对其进行标记以便移除。感谢您帮助我们保持高质量的回答!但我们通常更喜欢在这里找到答案,而不是链接到其他地方。我从你的帖子中真正得到的唯一一点是,解决方案在于使用join
和/或merge
。