gpt4 book ai didi

python - 检查当前行中的所有列值是否小于 Pandas 数据框中的前一行

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

有没有办法检查当前行中的所有列值是否小于 pandas 数据帧(整个数据帧)中前一行的相应列值,并相应地创建一个值为 1 或 0 的新列?

最佳答案

考虑数据框 df

np.random.seed([3,1415])
df = pd.DataFrame(np.random.rand(10, 4), columns=list('ABCD'))

A B C D
0 0.444939 0.407554 0.460148 0.465239
1 0.462691 0.016545 0.850445 0.817744
2 0.777962 0.757983 0.934829 0.831104
3 0.879891 0.926879 0.721535 0.117642
4 0.145906 0.199844 0.437564 0.100702
5 0.278735 0.609862 0.085823 0.836997
6 0.739635 0.866059 0.691271 0.377185
7 0.225146 0.435280 0.700900 0.700946
8 0.796487 0.018688 0.700566 0.900749
9 0.764869 0.253200 0.548054 0.778883

选项 1
转移

df.assign(New=(df < df.shift()).all(1).astype(int))

A B C D New
0 0.444939 0.407554 0.460148 0.465239 0
1 0.462691 0.016545 0.850445 0.817744 0
2 0.777962 0.757983 0.934829 0.831104 0
3 0.879891 0.926879 0.721535 0.117642 0
4 0.145906 0.199844 0.437564 0.100702 1
5 0.278735 0.609862 0.085823 0.836997 0
6 0.739635 0.866059 0.691271 0.377185 0
7 0.225146 0.435280 0.700900 0.700946 0
8 0.796487 0.018688 0.700566 0.900749 0
9 0.764869 0.253200 0.548054 0.778883 0

选项 2
numpy
与选项 1 相同的概念

v = df.values
df.assign(New=np.append(False, (v[1:] < v[:-1]).all(1).astype(int)))

A B C D New
0 0.444939 0.407554 0.460148 0.465239 0
1 0.462691 0.016545 0.850445 0.817744 0
2 0.777962 0.757983 0.934829 0.831104 0
3 0.879891 0.926879 0.721535 0.117642 0
4 0.145906 0.199844 0.437564 0.100702 1
5 0.278735 0.609862 0.085823 0.836997 0
6 0.739635 0.866059 0.691271 0.377185 0
7 0.225146 0.435280 0.700900 0.700946 0
8 0.796487 0.018688 0.700566 0.900749 0
9 0.764869 0.253200 0.548054 0.778883 0

选项 3
差异
使用 diff 将一行与下一行进行比较,看它是否小于零。然后使用 all 确定整行是否为 True

df.assign(New=df.diff().lt(0).all(1).astype(int))

A B C D New
0 0.444939 0.407554 0.460148 0.465239 0
1 0.462691 0.016545 0.850445 0.817744 0
2 0.777962 0.757983 0.934829 0.831104 0
3 0.879891 0.926879 0.721535 0.117642 0
4 0.145906 0.199844 0.437564 0.100702 1
5 0.278735 0.609862 0.085823 0.836997 0
6 0.739635 0.866059 0.691271 0.377185 0
7 0.225146 0.435280 0.700900 0.700946 0
8 0.796487 0.018688 0.700566 0.900749 0
9 0.764869 0.253200 0.548054 0.778883 0

时间

%timeit df.assign(New=df.diff().lt(0).all(1).astype(int))
%timeit df.assign(New=(df < df.shift()).all(1).astype(int))

1000 loops, best of 3: 579 µs per loop
1000 loops, best of 3: 1.56 ms per loop

%%timeit
v = df.values
df.assign(New=np.append(False, (v[1:] < v[:-1]).all(1).astype(int)))

1000 loops, best of 3: 322 µs per loop

diff 的工作原理

check if all the column values in the current row is less than the corresponding column values in previous row

这就是促使我使用 diff 的原因。 pandas.DataFrame.diff默认情况下计算每一列的 diff 数组。意思是,对于每一行,我们都有该行相对于前一行的差异。对于 OP 呈现为 True 的条件,我们需要此差异小于零。

df.diff()

A B C D
0 NaN NaN NaN NaN
1 0.017752 -0.391009 0.390297 0.352505
2 0.315271 0.741438 0.084384 0.013360
3 0.101929 0.168895 -0.213294 -0.713463
4 -0.733985 -0.727035 -0.283971 -0.016940
5 0.132829 0.410018 -0.351741 0.736296
6 0.460900 0.256197 0.605448 -0.459812
7 -0.514489 -0.430779 0.009629 0.323761
8 0.571340 -0.416592 -0.000334 0.199803
9 -0.031618 0.234512 -0.152512 -0.121866

然后

df.diff() < 0

A B C D
0 False False False False
1 False True False False
2 False False False False
3 False False True True
4 True True True True
5 False False True False
6 False False False True
7 True True False False
8 False True True False
9 True False True True

然后

(df.diff() < 0).all(1)

0 False
1 False
2 False
3 False
4 True
5 False
6 False
7 False
8 False
9 False
dtype: bool

关于python - 检查当前行中的所有列值是否小于 Pandas 数据框中的前一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44555832/

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