为了账号安全,请及时绑定邮箱和手机立即绑定

无类型下落不明

无类型下落不明

眼眸繁星 2022-10-25 15:05:04
我有以下数据框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 sum0  159  xyz  883nne2  28h93     lightz  10     2     2   71  354  abc  94mmm4k             heavy  15     2     2   3 2  354  abc  94mmm4k   455h             15     7     1   73  354  abc  94mmm4k             super   3     2     1   24  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 sum0  159  xyz  883nne2  28h93     lightz   10         12      2   71  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 组合,并且聚合计数和总和不会像合并之前那样显示。
查看完整描述

2 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

执行第一个groupby时,您还填写所有 nan 值df2 = df.fillna('').groupby(...)。因此,在 期间merge,您需要确保两个数据帧的 nan 值都已替换为''.

问题中的代码存在一些变量问题(例如,df2来自groupby等于df1con_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   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

实际结果将根据您的确切用例而有所不同,但这表明问题中最有可能出现的问题。


查看完整回答
反对 回复 2022-10-25
?
千巷猫影

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)



查看完整回答
反对 回复 2022-10-25
  • 2 回答
  • 0 关注
  • 84 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信