Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查当前行中的所有列值是否小于dataframe中的前一行_Python_Pandas_Numpy - Fatal编程技术网

Python 检查当前行中的所有列值是否小于dataframe中的前一行

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

是否有方法检查当前行中的所有列值是否小于数据帧(整个数据帧)中前一行中的相应列值,并创建一个值为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
shift

选项3
diff

使用
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