我有一个包含 A 列和 B 列的数据框。A 列具有非连续数据,其中一些行是 NAN,B 具有连续数据。我想创建第三列,其中对于每组具有 NAN 的 A 行,它将具有 B 中相同行中的值的总和 + B 中的下一个有效值。 C 中的所有其他值对于 A 中的 NAN 来说应该是 NAN,对于 A 中有效数字后面的行来说,B 的值应该是 NAN。 示例:
data = {
'A': [1, 1, None, None, 2, 5, None, None,3 ,4, 3, None , 5],
'B': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130]}
除了我需要 B + B 中下一个有效值之和的行之外,一切正常。 我使用以下代码。我有这段代码,但现在看起来很混乱。
`result = df.groupby(df['A'].isnull().cumsum())['B'].sum().reset_index()
df_result = pd.DataFrame({'C': result['Pumped']})
df_result.loc[1:, 'C'] -= result.loc[0, 'Pumped']
df.loc[~mask, 'C'] = df.loc[~mask, 'Pumped']
valid_rows_after_nan = df['dWL'].notnull() & mask.shift(1).fillna(False)
df.loc[valid_rows_after_nan, 'C'] = df_result
print(df)`
我希望输出如下所示:
`data = {
'A': [1, 1, None, None, 2, 5, None, None,3 ,4, 3, None , 5],
'B': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130],
'C': [10, 20, None, None, 120, 60, None, None, 240, 100, 110, None, 5]
}
groupby.transform
的简单版本:
# identify the non-NA and reverse
m = df.loc[::-1, 'A'].notna()
# group the preceding NA, sum, mask where NA
df['C'] = df.groupby(m.cumsum())['B'].transform('sum').where(m)
输出:
A B C
0 1.0 10 10.0
1 1.0 20 20.0
2 NaN 30 NaN
3 NaN 40 NaN
4 2.0 50 120.0
5 5.0 60 60.0
6 NaN 70 NaN
7 NaN 80 NaN
8 3.0 90 240.0
9 4.0 100 100.0
10 3.0 110 110.0
11 NaN 120 NaN
12 5.0 130 250.0