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

标签 python pandas numpy

有没有办法检查当前行中的所有列值是否小于 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/

相关文章:

python - 自动传输文件到文件夹(OpenCV)

python - 模块级别的上下文管理资源

python-3.x - SQLAlchemy:将数据帧保存到 SQL(无法调整类型 'dict' )

python - 使用 pandas 在 python 中读取 csv 文件时出错

python - 将字符串转换为二维 numpy 数组

python - 计算 DataFrame 中的行增量值

python - 函数返回一个向量,如何通过 NumPy 最小化

python - 如何解码 python-requests URL?

python - 如何解决 "botocore.exceptions.ClientError: An error occurred (AccessDenied)"错误?

python - pandas groupby 中的聚合函数是否以不同方式处理内置函数?