Python 没有一种类型未说明

Python 没有一种类型未说明,python,pandas,Python,Pandas,我有以下数据帧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 94mm

我有以下数据帧
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                
但我希望看到:

   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   3     
2  354  abc  94mmm4k   455h              15         72       1   7     
3  354  abc  94mmm4k             super    3         21       1   2     
4  354  abc  94mmm4k    53g              10         42       2   8   
相反


由于某些原因,当我合并我的列时,
df2
上执行的计数和求和不考虑空或NaN组合,并且聚合计数和求和不会像合并之前那样显示。

我高度怀疑您的一个索引列在对象和数字类型之间不匹配。请在合并代码之前添加此项以进行检查

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)

在执行第一个
groupby
时,还将填充所有nan值
df2=df.fillna(“”).groupby(…)
。因此,在
合并期间
,您需要确保两个数据帧的nan值都被
'
替换

问题中的代码存在一些可变问题(例如,
groupby
中的
df2
是否等于
df1
con_subs_df
),因此我创建了一个自合并的小示例,输入数据是问题中的第一个数据帧
df

首先是
groupby
(与问题中相同):

在合并中,由于两个数据帧的列相同,我们可以使用
on
参数,而不是
on
上的
left\u和
on
上的
right\u。在这里,我们对前面的数据帧进行
合并

  • 没有
    填充(“”)

  • 使用
    填充(“”)

    结果:

        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
    

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

您能提供一个解决方案吗?您需要在这里展示工作的成功之处。你提到的问题是正确的。我没有在两个数据帧中都考虑NAN值。我很感谢你抽出时间来探索solution@Aldo:很乐意帮忙:)
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
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