这是我的输入:
import pandas as pd
import numpy as np
list1 = [10,79,6,38,4,557,12,220,46,22,45,22]
list2 = [4,3,23,6,234,47,312,2,426,42,435,23]
df = pd.DataFrame({'A' : list1, 'B' : list2}, columns = ['A', 'B'])
df['C'] = np.where (df['A'] > df['B'].shift(-2), 1, np.nan)
print (df)
产生这个输出:
A B C
0 10 4 NaN
1 79 3 1.0
2 6 23 NaN
3 38 6 NaN
4 4 234 NaN
5 557 47 1.0
6 12 312 NaN
7 220 2 1.0
8 46 426 NaN
9 22 42 NaN
10 45 435 NaN
11 22 23 NaN
我需要做的是将“C”列更改为一组三个连续的 1,不重叠。所需的输出是:
A B C
0 10 4 NaN
1 79 3 1.0
2 6 23 1.0
3 38 6 1.0
4 4 234 NaN
5 557 47 1.0
6 12 312 1.0
7 220 2 1.0
8 46 426 NaN
9 22 42 NaN
10 45 435 NaN
11 22 23 NaN
因此,第 2、3 和 6 行从 NaN 变为 1.0。第 7 行已经有一个 1.0,它被忽略了。第 8 行和第 9 行需要保持 NaN,因为第 7 行是前一组的最后一个条目。
我不知道是否有更好的方法来构建可以在创建时执行此操作的列“C”。
我尝试了几个版本的 fillna 和 ffill,没有一个对我有用。
看起来很复杂,但我尝试用这一行隔离每个 1.0 的行 ID:
print (df.loc[df['C'] == 1])
哪个正确输出:
A B C
1 79 3 1.0
5 557 47 1.0
7 220 2 1.0
尽管我知道这些信息,但我不知道如何从那里着手。
非常感谢您提前提供的帮助,大卫