gpt4 book ai didi

python - pandas Dataframe 将 NaN 值替换为基于键列的先前值

转载 作者:行者123 更新时间:2023-11-28 21:36:25 26 4
gpt4 key购买 nike

我有一个 pd.dataframe,看起来像这样:

key_value    a    b    c    d    e
value_01 1 10 x NaN NaN
value_01 NaN 12 NaN NaN NaN
value_01 NaN 7 NaN NaN NaN
value_02 7 4 y NaN NaN
value_02 NaN 5 NaN NaN NaN
value_02 NaN 6 NaN NaN NaN
value_03 19 15 z NaN NaN

所以现在基于key_value,

对于“a”和“c”列,我想根据键值从同一列“a”和“c”复制最后一个单元格的值。

对于另一列“d”,我想将第“i - 1”行的单元格值从“b”列复制到“d”列的第 i 个单元格。

最后,对于“e”列,我想将“i - 1”个单元格的总和从“b”列复制到“e”列第 i 个单元格。

对于每个 key_value,列“a”、“b”和“c”在其第一行中有一些值,根据这些值复制下一个值或针对不同的列复制值正在生成。

key_value    a    b    c    d    e
value_01 1 10 x NaN NaN
value_01 1 12 x 10 10
value_01 1 7 x 12 22
value_02 7 4 y NaN NaN
value_02 7 5 y 4 4
value_02 7 6 y 5 9
value_03 8 15 z NaN NaN

我目前的做法:

size = df.key_value.size
for i in range(size):
if pd.isna(df.a[i]) and df.key_value[i] == output.key_value[i - 1]:
df.a[i] = df.a[i - 1]
df.c[i] = df.c[i - 1]
df.d[i] = df.b[i - 1]
df.e[i] = df.e[i] + df.b[i - 1]

对于像“a”和“b”这样的列,NaN 值都在同一行索引中。

我的方法有效,但需要很长时间,因为我的 datframe 有超过 50000 条记录,我想知道是否有不同的方法来做到这一点,因为我有多个列,如 'a' 和 'b',其中需要复制值基于 'key_value' 和一些使用像 'b' 这样的列计算值的列

最佳答案

pd.concatgroupbyassign

pd.concat([
g.ffill().assign(d=lambda d: d.b.shift(), e=lambda d: d.d.cumsum())
for _, g in df.groupby('key_value')
])

key_value a b c d e
0 value_01 1.0 1 x NaN NaN
1 value_01 1.0 2 x 1.0 1.0
2 value_01 1.0 3 x 2.0 3.0
3 value_02 7.0 4 y NaN NaN
4 value_02 7.0 5 y 4.0 4.0
5 value_02 7.0 6 y 5.0 9.0
6 value_03 19.0 7 z NaN NaN

groupbyapply

def h(g):
return g.ffill().assign(
d=lambda d: d.b.shift(), e=lambda d: d.d.cumsum())

df.groupby('key_value', as_index=False, group_keys=False).apply(h)

关于python - pandas Dataframe 将 NaN 值替换为基于键列的先前值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51049326/

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