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)
添加回答
舉報