Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫基于另一个数据帧中的匹配列填充新的数据帧列_Python_Pandas_Merge_Populate - Fatal编程技术网

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