无类型下落不明

我有以下数据框df:


       x_1  x_2      x_3    x_4        x_5  ID  cost 

0  159  xyz  883nne2  28h93     lightz  10     2       

1  159  xyz  883nne2  28h93     lightz  10     5       

2  354  abc  94mmm4k             heavy  15     2       

3  354  abc  94mmm4k             heavy  15     1       

4  354  abc  94mmm4k   455h             15     7       

5  354  abc  94mmm4k             super   3     2       

6  354  abc  94mmm4k    53g             10     4   

7  354  abc  94mmm4k    53g             10     4 

我正在使用以下内容来获取汇总计数加上成本列的总和:


df2 = df.fillna('').groupby(['x_1','x_2','x_3','x_4','x_5','ID'])['cost'].agg(['count','sum'])

这将返回我所期望的,即:


   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  354  abc  94mmm4k             heavy  15     2     2   3 

2  354  abc  94mmm4k   455h             15     7     1   7

3  354  abc  94mmm4k             super   3     2     1   2

4  354  abc  94mmm4k    53g             10     4     2   8

然后,我将此数据帧与另一个数据帧合并,以使用以下方法比较聚合计数:


y_merge_cols = ['y_1','y_2','y_3','y_4','y_5','ID']

x_merge_cols = ['x_1','x_2','x_3','x_4','x_5','ID']


d1 = df1.merge(con_subs_df, left_on=y_merge_cols, right_on=x_merge_cols, how='left')

我的输出是:


   y_1  y_2      y_3    y_4       y_5  y_id    y_count   count sum

0  159  xyz  883nne2  28h93     lightz   10         12      2   7

1  354  abc  94mmm4k             heavy   15         24                 

2  354  abc  94mmm4k   455h              15         72                

3  354  abc  94mmm4k             super    3         21                

4  354  abc  94mmm4k    53g              10         42                

由于某种原因,当我合并列时,完成的计数和总和df2没有考虑空或 NaN 组合,并且聚合计数和总和不会像合并之前那样显示。


眼眸繁星
浏览 85回答 2
2回答

蓝山帝景

执行第一个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_onand 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   sum0   159 xyz 883nne2 28h93   lightz  10     2      2.0   7.01   159 xyz 883nne2 28h93   lightz  10     5      2.0   7.02   354 abc 94mmm4k   NaN    heavy  15     2      NaN   NaN3   354 abc 94mmm4k   NaN    heavy  15     1      NaN   NaN4   354 abc 94mmm4k  455h      NaN  15     7      NaN   NaN5   354 abc 94mmm4k   NaN    super  3      2      NaN   NaN6   354 abc 94mmm4k   53g      NaN  10     4      NaN   NaN7   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   sum0   159 xyz 883nne2 28h93   lightz  10     2        2     71   159 xyz 883nne2 28h93   lightz  10     5        2     72   354 abc 94mmm4k          heavy  15     2        2     33   354 abc 94mmm4k          heavy  15     1        2     34   354 abc 94mmm4k 455h            15     7        1     75   354 abc 94mmm4k          super  3      2        1     26   354 abc 94mmm4k 53g             10     4        2     87   354 abc 94mmm4k 53g             10     4        2     8实际结果将根据您的确切用例而有所不同,但这表明问题中最有可能出现的问题。

千巷猫影

我高度怀疑您的索引列之一在对象和数字类型之间不匹配。请在合并代码之前添加此内容以进行检查。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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python