替换多索引中除第一行之外的所有内容

2024-10-03 04:28:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用pandas并将一些数据加载到数据帧中。我想做的是替换数据中除每个组中第一个值外的所有场景频率列。在

我的数据如下:

ExplosionID  FireWater  FireID    Scenario Frequency
111          0          213       4.209055e-15
                        214       4.209055e-15
                        215       4.209055e-15
                        217       4.209055e-15
                        219       4.209055e-15
                        220       4.209055e-15
112          0          232       8.388742e-16
                        233       8.388742e-16
                        234       8.388742e-16
                        235       8.388742e-16
                        237       8.388742e-16
                        239       8.388742e-16
                        240       8.388742e-16

我想将scenario frequency列中除第一个值外的所有值替换为0,这样我就得到了:

^{pr2}$

前三列(ExplosionIFireWaterFireID)是多索引中的索引。在

我定义了一个函数:

#function to replace all but first value in group with 0
def replace_all_except_first(group):
    group.iloc[1:] = 0
    return group

并尝试了以下方法:

data_to_sum = HL_df_subset.groupby(level=0).apply(replace_all_except_first)

其中HL_df_subset是我的数据帧。但是,这会将所有值与0放在一起。在

我是python新手,我知道我完全误解了groupby的工作原理,但我一直在尝试各种各样的方法,都无法让它正常工作。在

谢谢你的帮助。在


Tags: to数据方法pandasdfgroupallhl
1条回答
网友
1楼 · 发布于 2024-10-03 04:28:32
  • cumcount:查找顺序。创建一个不等于0的布尔序列。这意味着,不是第一排
  • mask:获取真值并屏蔽数据帧的相关部分。在本例中,它使得cumcount不为0的任何地方都是np.nan。在
  • fillna:取这些np.nan,并用零填充

HL_df_subset.mask(HL_df_subset.groupby(level=0).cumcount().ne(0)).fillna(0)

考虑df

^{pr2}$
df.mask(df.groupby(level=[0, 1]).cumcount().ne(0)).fillna(0)

           A
a x 1  100.0
    2    0.0
    3    0.0
    4    0.0
  y 1  104.0
    2    0.0
    3    0.0
    4    0.0
b x 1  108.0
    2    0.0
    3    0.0
    4    0.0
  y 1  112.0
    2    0.0
    3    0.0
    4    0.0

相关问题 更多 >