我試圖通過將已知值傳播到同一組中的值來填充 DataFrame 中的空行。當分組的所有列都已滿時,這似乎作業正常,但如果列中有空單元格,Pandas 將洗掉值。在提供的示例中,DataFrame 在索引 6 和 8 處的“B”列中具有 NaN。在組上使用ffill和后bfill,第 6 行和第 8 行中的數字已替換為 NaN。如何避免這種意外的副作用?
代碼:
import pandas as pd
import numpy as np
df = pd.DataFrame({"A": [1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 6, 6],
"B": ['a', 'a', 'b', 'b', 'b', 'c', np.nan, 'd',
np.nan, 'e', 'e', 'g', 'h', 'h'],
"C": [5.0, np.nan, 4.0, 4.0, np.nan, 9.0, np.nan,
np.nan, 9.0, 8.0, np.nan, 2.0, np.nan, 3.0],
"D": [1.0, 1.0, np.nan, 2.0, np.nan, np.nan, np.nan,
np.nan, 3.0, 2.0, np.nan, 9.0, np.nan, 3.0],
"E": [np.nan, 6.0, np.nan, 3.0, np.nan, np.nan, 7.0,
np.nan, 7.0, 2.0, np.nan, np.nan, np.nan, 0.0]})
cols_to_groupby = ["A", "B"]
cols_to_fill = ["C", "D", "E"]
original_indxs = df.index
df[cols_to_fill] = (
df.sort_values(cols_to_groupby)[cols_to_fill cols_to_groupby]
.groupby(cols_to_groupby)
.transform(lambda x: x.ffill().bfill())
)
樣本資料集:
A B C D E
0 1 a 5.0 1.0 NaN
1 1 a NaN 1.0 6.0
2 2 b 4.0 NaN NaN
3 2 b 4.0 2.0 3.0
4 2 b NaN NaN NaN
5 3 c 9.0 NaN NaN
6 3 NaN NaN NaN 7.0
7 3 d NaN NaN NaN
8 3 NaN 9.0 3.0 7.0
9 4 e 8.0 2.0 2.0
10 4 e NaN NaN NaN
11 5 g 2.0 9.0 NaN
12 6 h NaN NaN NaN
13 6 h 3.0 3.0 0.0
預期結果:
A B C D E
0 1 a 5.0 1.0 6.0
1 1 a 5.0 1.0 6.0
2 2 b 4.0 2.0 3.0
3 2 b 4.0 2.0 3.0
4 2 b 4.0 2.0 3.0
5 3 c 9.0 NaN NaN
6 3 NaN NaN NaN 7.0
7 3 d NaN NaN NaN
8 3 NaN 9.0 3.0 7.0
9 4 e 8.0 2.0 2.0
10 4 e 8.0 2.0 2.0
11 5 g 2.0 9.0 NaN
12 6 h 3.0 3.0 0.0
13 6 h 3.0 3.0 0.0
實際結果:
A B C D E
0 1 a 5.0 1.0 6.0
1 1 a 5.0 1.0 6.0
2 2 b 4.0 2.0 3.0
3 2 b 4.0 2.0 3.0
4 2 b 4.0 2.0 3.0
5 3 c 9.0 NaN NaN
6 3 NaN NaN NaN NaN
7 3 d NaN NaN NaN
8 3 NaN NaN NaN NaN
9 4 e 8.0 2.0 2.0
10 4 e 8.0 2.0 2.0
11 5 g 2.0 9.0 NaN
12 6 h 3.0 3.0 0.0
13 6 h 3.0 3.0 0.0
uj5u.com熱心網友回復:
默認情況下groupby將忽略組鍵列包含NaN值的行,因此您不能依賴索引對齊(df[cols_to_fill] = ...)來更新資料幀,我們必須update使用 groupby 的結果顯式地顯示原始資料
cols = df.groupby(cols_to_groupby)[cols_to_fill].apply(lambda x: x.ffill().bfill())
df.update(cols)
A B C D E
0 1 a 5.0 1.0 6.0
1 1 a 5.0 1.0 6.0
2 2 b 4.0 2.0 3.0
3 2 b 4.0 2.0 3.0
4 2 b 4.0 2.0 3.0
5 3 c 9.0 NaN NaN
6 3 NaN NaN NaN 7.0
7 3 d NaN NaN NaN
8 3 NaN 9.0 3.0 7.0
9 4 e 8.0 2.0 2.0
10 4 e 8.0 2.0 2.0
11 5 g 2.0 9.0 NaN
12 6 h 3.0 3.0 0.0
13 6 h 3.0 3.0 0.0
uj5u.com熱心網友回復:
一種方法是過濾掉帶有 NaN 的行,只填充“B”列中沒有 NaN 的行;然后將其余部分連接回來:
notna_df = df[df['B'].notna()]
out = (pd.concat((notna_df.drop(columns=cols_to_fill)
.join(notna_df.groupby(cols_to_groupby)[cols_to_fill]
.apply(lambda x: x.bfill().ffill())),
df[df['B'].isna()]))
.sort_index())
輸出:
A B C D E
0 1 a 5.0 1.0 6.0
1 1 a 5.0 1.0 6.0
2 2 b 4.0 2.0 3.0
3 2 b 4.0 2.0 3.0
4 2 b 4.0 2.0 3.0
5 3 c 9.0 NaN NaN
6 3 NaN NaN NaN 7.0
7 3 d NaN NaN NaN
8 3 NaN 9.0 3.0 7.0
9 4 e 8.0 2.0 2.0
10 4 e 8.0 2.0 2.0
11 5 g 2.0 9.0 NaN
12 6 h 3.0 3.0 0.0
13 6 h 3.0 3.0 0.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/444450.html
標籤:Python 熊猫 数据框 熊猫-groupby 菲尔娜
上一篇:使用過濾器合并Pandas
