Python 熊猫加入DF-合并与加入不同语义
我想加入熊猫队。有些列是int或float,有些是categories。(对于A和B df中的类别,不强制执行相同的cat代码/索引) 它们的公共列是大小为8的float和category列的列表 通过连接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
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解释,可以很好地处理示例数据。