Python 熊猫加入DF-合并与加入不同语义

Python 熊猫加入DF-合并与加入不同语义,python,pandas,join,Python,Pandas,Join,我想加入熊猫队。有些列是int或float,有些是categories。(对于A和B df中的类别,不强制执行相同的cat代码/索引) 它们的公共列是大小为8的float和category列的列表 通过连接 df_a.merge(df_b, how='inner'), on=join_columns ) df_a.join(df_b, lsuffix='_l', rsuffix='_r') 不会返回任何结果。并通过 df_a.merge(df_b, how='inner'), on=join

我想加入熊猫队。有些列是int或float,有些是categories。(对于A和B df中的类别,不强制执行相同的cat代码/索引) 它们的公共列是大小为8的float和category列的列表

通过连接

df_a.merge(df_b, how='inner'), on=join_columns )
df_a.join(df_b, lsuffix='_l', rsuffix='_r')
不会返回任何结果。并通过

df_a.merge(df_b, how='inner'), on=join_columns )
df_a.join(df_b, lsuffix='_l', rsuffix='_r')
似乎有效

但我有点困惑,为什么其中一个失败了,如果我不应该将所有列强制转换为object,以防止通过cat代码连接,这可能是错误的

也就是说,如果选择
left
作为
merge
的联接方法,则联接的列将只包含
NAN
值。不幸的是,我不确定如何构建一个有用的最小示例

编辑 这是样品

import pandas as pd

raw_data = {
        'subject_id': ['1', '2', '3', '4', '5'],
        'name': ['A', 'B', 'C', 'D', 'E'],
        'nationality': ['DE', 'AUT', 'US', 'US', 'US'],
        'age_group' : [1, 2, 1, 3, 1]}
df_a = pd.DataFrame(raw_data, columns = ['subject_id', 'name', 'nationality', 'age_group'])
df_a.nationality = df_a.nationality.astype('category')
df_a


raw_data = {
        'subject_id': ['1', '2', '3' ],
        'name': ['Billy', 'Brian', 'Bran'],
        'nationality': ['DE', 'US', 'US'],
        'age_group' : [1, 1, 3],
        'average_return_per_group' : [1.5, 2.3, 1.4]}
df_b = pd.DataFrame(raw_data, columns = ['subject_id', 'name', 'nationality', 'age_group', 'average_return_per_group'])
df_b.nationality = df_b.nationality.astype('category')
df_b


# some result is joined
df_a.join(df_b, lsuffix='_l', rsuffix='_r') 

# this *fails* as only NULL values joined, or nor result for inner join
df_a.merge(df_b, how='left', on=['nationality', 'age_group'])

我认为主要的区别是
join
有默认的
left join
merge
内部连接。
join
按照默认值沿着索引进行连接,并且
merge
沿着具有相同名称的列进行连接

选中此项:

In [115]: df_a.join(df_b, lsuffix='_l', rsuffix='_r')
Out[115]:
  subject_id_l name_l nationality_l  age_group_l subject_id_r name_r nationality_r  age_group_r average_returns_per_group
0            1      A            DE            1            1  Billy            DE          1.0                       NaN
1            2      B           AUT            2            2  Brian            US          1.0                       NaN
2            3      C            US            1            3   Bran            US          3.0                       NaN
3            4      D            US            3          NaN    NaN           NaN          NaN                       NaN
4            5      E            US            1          NaN    NaN           NaN          NaN                       NaN
让我们将
['a'、'b'、'c']
设置为
df_b
中的索引,并再次尝试加入它-您将在所有
*\r
列中只看到
NaN

In [116]: df_a.join(df_b.set_index(pd.Index(['a','b','c'])), lsuffix='_l', rsuffix='_r')
Out[116]:
  subject_id_l name_l nationality_l  age_group_l subject_id_r name_r nationality_r  age_group_r average_returns_per_group
0            1      A            DE            1          NaN    NaN           NaN          NaN                       NaN
1            2      B           AUT            2          NaN    NaN           NaN          NaN                       NaN
2            3      C            US            1          NaN    NaN           NaN          NaN                       NaN
3            4      D            US            3          NaN    NaN           NaN          NaN                       NaN
4            5      E            US            1          NaN    NaN           NaN          NaN                       NaN

In [117]: df_b.set_index(pd.Index(['a','b','c']))
Out[117]:
  subject_id   name nationality  age_group average_returns_per_group
a          1  Billy          DE          1                       NaN
b          2  Brian          US          1                       NaN
c          3   Bran          US          3                       NaN
更新:IMO按预期工作(在文档中描述)


您可以添加一些示例数据吗?当然可以,但是如果选择
left
进行
合并
,则列会被合并,但结果只是NAN值,其中join会生成一些乍看起来合理的输出。嗯,您可以添加数据吗?也许它可以更容易地发现问题。我添加了一个示例datasetI,但如果我想加入值,这将不会产生有用的结果?也就是说,A很长,B包含一些我想查找/加入的附加元数据。@GeorgHeiler,请提供样本可复制数据集我添加了一个样本dataset@GeorgHeiler,检查您的
dfu b['average\u returns\u per\u group']
-它包含所有
NaN
!我开始检查这个。第一栏似乎是正确的。明天我将继续解决这个问题,并在这里向您提供最新信息。今天,我会将您的问题标记为正确,因为这是一个很好的join vs merge解释,可以很好地处理示例数据。