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_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
實際結果將根據您的確切用例而有所不同,但這表明問題中最有可能出現的問題。
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)
添加回答
舉報
