Python 检查当前行中的所有列值是否小于dataframe中的前一行
是否有方法检查当前行中的所有列值是否小于数据帧(整个数据帧)中前一行中的相应列值,并创建一个值为1或0的新列?考虑数据帧Python 检查当前行中的所有列值是否小于dataframe中的前一行,python,pandas,numpy,Python,Pandas,Numpy,是否有方法检查当前行中的所有列值是否小于数据帧(整个数据帧)中前一行中的相应列值,并创建一个值为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
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
选项1shift
选项3diff
使用
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
然后
df.diff()<0
A、B、C、D
0错误-错误-错误-错误
1假真假假
2假假假假
3假假真
4真的真的真的
5假假真假
6假假假真
7真假假
8假真假
9对错对
然后
(df.diff()<0)。全部(1)
0错误
1错误
2错误
3错误
4正确
5错误
6错误
7错误
8错误
9错误
数据类型:bool
您能详细说明一下吗?我不明白!为什么我们要检查小于零?我需要这样的东西。我需要检查当前行。如果当前行中的每一列都小于该行中相应的列值,则新列中需要一个“1”。否则“0”列1列2输出20 40 NULL 30 80 1 40 20 0非常感谢您花时间解释!谢谢进一步扩展这一点,以防我需要检查当前行中,当前行的所有列是否都小于先前对应的列(所有先前的行出现在当前行之前),是否可能?区别在于,前面只考虑检查前一行,现在我希望考虑所有前一行。谢谢你的时间!
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
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