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

时间:2017-06-15 00:15:50

标签: python pandas

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

2 个答案:

答案 0 :(得分:1)

考虑数据框np.random.seed(1) df = pd.DataFrame(np.random.rand(10, 2), columns=list('AB')) df A B 0 0.417022 0.720324 1 0.000114 0.302333 2 0.146756 0.092339 3 0.186260 0.345561 4 0.396767 0.538817 5 0.419195 0.685220 6 0.204452 0.878117 7 0.027388 0.670468 8 0.417305 0.558690 9 0.140387 0.198101

True

选项1
cumminshift
这里的概念是跟踪每列的最小值。如果特定行上的值小于前一行和它之前的所有行,则它必须是新的min。我们可以通过检查它是否小于前一行的最小值来判断这是NaN 注意这应该可以正常使用df.assign(New=(df < df.cummin().shift()).all(1).astype(int)) A B New 0 0.417022 0.720324 0 1 0.000114 0.302333 1 2 0.146756 0.092339 0 3 0.186260 0.345561 0 4 0.396767 0.538817 0 5 0.419195 0.685220 0 6 0.204452 0.878117 0 7 0.027388 0.670468 0 8 0.417305 0.558690 0 9 0.140387 0.198101 0 值。

numpy

选项2
v = df.values c = np.minimum.accumulate(v[:-1], axis=0) df.assign(New=np.append(False, (v[1:] < c).all(1)).astype(int)) A B New 0 0.417022 0.720324 0 1 0.000114 0.302333 1 2 0.146756 0.092339 0 3 0.186260 0.345561 0 4 0.396767 0.538817 0 5 0.419195 0.685220 0 6 0.204452 0.878117 0 7 0.027388 0.670468 0 8 0.417305 0.558690 0 9 0.140387 0.198101 0 版本
numpy.minimum

{{1}}

答案 1 :(得分:0)

使用@ piRsuared的DF:

np.random.seed(1)
df = pd.DataFrame(np.random.rand(10, 2), columns=list('AB'))
Out[31]: 
          A         B
0  0.417022  0.720324
1  0.000114  0.302333
2  0.146756  0.092339
3  0.186260  0.345561
4  0.396767  0.538817
5  0.419195  0.685220
6  0.204452  0.878117
7  0.027388  0.670468
8  0.417305  0.558690
9  0.140387  0.198101

您可以使用apply将当前行与所有先前行的最大值进行比较,然后将结果转换为int。

df.apply(lambda x: (x<df[0:x.name].max()).all().astype(int),axis=1)
Out[30]: 
0    0
1    1
2    1
3    1
4    1
5    0
6    0
7    1
8    1
9    1
dtype: int64