gpt4 book ai didi

python - 如何在 pandas 中创建一个新列,其中包含与先前特定值的索引差异?

转载 作者:行者123 更新时间:2023-12-01 03:55:49 25 4
gpt4 key购买 nike

具有以下数据框:

df = pd.DataFrame(np.ones(10).reshape(10,1), columns=['A'])
df.ix[2]['A'] = 0
df.ix[6]['A'] = 0

A
0 1
1 1
2 0
3 1
4 1
5 1
6 0
7 1
8 1
9 1

我正在尝试添加一个新列B,该列将在A列中包含许多“1”出现次数,直到出现第一个“0”事件之前。预期输出应该是这样的:

   A  B
0 1 0
1 1 2
2 0 0
3 1 0
4 1 0
5 1 3
6 0 0
7 1 0
8 1 0
9 1 3

有什么有效的矢量化方法可以做到这一点吗?

最佳答案

您可以使用:

a = df.A.groupby((df.A != df.A.shift()).cumsum()).cumcount() + 1
print (a)
0 1
1 2
2 1
3 1
4 2
5 3
6 1
7 1
8 2
9 3
dtype: int64

b = ((~df.A.astype(bool)).shift(-1).fillna(df.A.iat[-1].astype(bool)))
print (b)
0 False
1 True
2 False
3 False
4 False
5 True
6 False
7 False
8 False
9 True
Name: A, dtype: bool
df['B'] = ( a * b )
print (df)
A B
0 1.0 0
1 1.0 2
2 0.0 0
3 1.0 0
4 1.0 0
5 1.0 3
6 0.0 0
7 1.0 0
8 1.0 0
9 1.0 3

说明:

#difference with shifted A
df['C'] = df.A != df.A.shift()
#cumulative sum
df['D'] = (df.A != df.A.shift()).cumsum()
#cumulative count each group
df['a'] = df.A.groupby((df.A != df.A.shift()).cumsum()).cumcount() + 1

#invert and convert to boolean
df['F'] = ~df.A.astype(bool)
#shift
df['G'] = (~df.A.astype(bool)).shift(-1)
#fill last nan
df['b'] = (~df.A.astype(bool)).shift(-1).fillna(df.A.iat[-1].astype(bool))

print (df)
A B C D a F G b
0 1.0 0 True 1 1 False False False
1 1.0 2 False 1 2 False True True
2 0.0 0 True 2 1 True False False
3 1.0 0 True 3 1 False False False
4 1.0 0 False 3 2 False False False
5 1.0 3 False 3 3 False True True
6 0.0 0 True 4 1 True False False
7 1.0 0 True 5 1 False False False
8 1.0 0 False 5 2 False False False
9 1.0 3 False 5 3 False NaN True

最后一个 NaN 有问题。因此,我通过 df.A.iat[-1] 检查列 A 的最后一个值,并将其转换为 boolean。因此,如果为 0,则输出为 False,最后为 0 或如果 1,则输出为 True 然后使用 a 的最后一个值。

关于python - 如何在 pandas 中创建一个新列,其中包含与先前特定值的索引差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37477623/

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