我有一个包含列A和列B的数据帧.列A包含非连续数据,其中一些行是NaN,而B包含连续数据.我想创建第三列,其中对于每一组具有NaN的A行,它将具有B中相同行中的值的总和+B中的下一个有效值. 对于A中的NaN,C中的所有其他值应该为NaN,对于A中有效数字后面的行,C中的所有其他值都应该为B值. 示例:

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

Python相关问答推荐

Odoo -无法比较使用@api.depends设置计算字段的日期

分组数据并删除重复数据

如何从具有多个嵌入选项卡的网页中Web抓取td类元素

Select 用a和i标签包裹的复选框?

Deliveryter Notebook -无法在for循环中更新matplotlib情节(保留之前的情节),也无法使用动画子功能对情节进行动画

如何避免Chained when/then分配中的Mypy不兼容类型警告?

非常奇怪:tzLocal.get_Localzone()基于python3别名的不同输出?

将数据框架与导入的Excel文件一起使用

按列分区,按另一列排序

Streamlit应用程序中的Plotly条形图中未正确显示Y轴刻度

给定高度约束的旋转角解析求解

Polars asof在下一个可用日期加入

在单次扫描中创建列表

python panda ExcelWriter切换动态公式到数组公式

如何在海上配对图中使某些标记周围的黑色边框

如何删除重复的文字翻拍?

Python 3试图访问在线程调用中实例化的类的对象

freq = inject在pandas中做了什么?''它与freq = D有什么不同?''

通过对列的其余部分进行采样,在Polars DataFrame中填充_null`?

Pandas 删除只有一种类型的值的行,重复或不重复