2 回答
TA贡献1843条经验 获得超7个赞
执行第一个groupby
时,您还填写所有 nan 值df2 = df.fillna('').groupby(...)
。因此,在 期间merge
,您需要确保两个数据帧的 nan 值都已替换为''
.
问题中的代码存在一些变量问题(例如,df2
来自groupby
等于df1
或con_subs_df
合并中),所以我创建了一个自我合并的小示例,输入数据是df
问题中的第一个数据框。
首先groupby
(与问题相同):
df2 = df.fillna('').groupby(['x_1','x_2','x_3','x_4','x_5','ID'])['cost'].agg(['count','sum']).reset_index()
在合并中,由于两个数据框的列相同,我们可以使用on
参数来代替left_on
and right_on
。在这里,我们merge
使用之前的df
数据框进行操作。
没有fillna(''):
df1 = df.merge(df2, on=['x_1','x_2','x_3','x_4','x_5','ID'], how='left')
x_1 x_2 x_3 x_4 x_5 ID cost count sum
0 159 xyz 883nne2 28h93 lightz 10 2 2.0 7.0
1 159 xyz 883nne2 28h93 lightz 10 5 2.0 7.0
2 354 abc 94mmm4k NaN heavy 15 2 NaN NaN
3 354 abc 94mmm4k NaN heavy 15 1 NaN NaN
4 354 abc 94mmm4k 455h NaN 15 7 NaN NaN
5 354 abc 94mmm4k NaN super 3 2 NaN NaN
6 354 abc 94mmm4k 53g NaN 10 4 NaN NaN
7 354 abc 94mmm4k 53g NaN 10 4 NaN NaN
与fillna(''):
df1 = df.fillna('').merge(df2, on=['x_1','x_2','x_3','x_4','x_5','ID'], how='left')
结果:
x_1 x_2 x_3 x_4 x_5 ID cost count sum
0 159 xyz 883nne2 28h93 lightz 10 2 2 7
1 159 xyz 883nne2 28h93 lightz 10 5 2 7
2 354 abc 94mmm4k heavy 15 2 2 3
3 354 abc 94mmm4k heavy 15 1 2 3
4 354 abc 94mmm4k 455h 15 7 1 7
5 354 abc 94mmm4k super 3 2 1 2
6 354 abc 94mmm4k 53g 10 4 2 8
7 354 abc 94mmm4k 53g 10 4 2 8
实际结果将根据您的确切用例而有所不同,但这表明问题中最有可能出现的问题。
TA贡献1829条经验 获得超7个赞
我高度怀疑您的索引列之一在对象和数字类型之间不匹配。请在合并代码之前添加此内容以进行检查。
for i in range(len(y_merge_cols)):
assert y_merge_cols[i].dtype == x_merge_cols[i].dtype,\
'Expected type {} got {}'.format(y_merge_cols[i].dtype,x_merge_cols[i].dtype)
添加回答
举报