有没有办法检查当前行中的所有列值是否小于pandas数据帧(整个数据帧中)所有先前行(直到当前行)中的相应列值,并创建一个新列相应的值是1还是0?
答案 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
cummin
与shift
这里的概念是跟踪每列的最小值。如果特定行上的值小于前一行和它之前的所有行,则它必须是新的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