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