gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:20:47 24 4
gpt4 key购买 nike

我正在使用 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

我想用 0 替换方案频率列中除第一个值以外的所有值,这样我就可以得到这个:

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

前三列(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 的工作原理,但我一直在尝试各种方法,但无法让它工作。

感谢您的帮助。

最佳答案

  • cumcount:查找排序。创建一个不等于 0 的 bool 系列。这意味着,不是第一行
  • mask:采用真值并屏蔽数据帧的相关部分。在这种情况下,它使 cumcount 不为零的所有地方成为 np.nan
  • fillna:取那些 np.nan 并用零填充它们

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

考虑df

df = pd.DataFrame(
dict(A=np.arange(100, 116)),
pd.MultiIndex.from_product(
[list('ab'), list('xy'), [1, 2, 3, 4]]))
df

A
a x 1 100
2 101
3 102
4 103
y 1 104
2 105
3 106
4 107
b x 1 108
2 109
3 110
4 111
y 1 112
2 113
3 114
4 115

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

关于python - 替换多索引中除第一行以外的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40431952/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com