基于同一列的前一行计算 pandas 数据框(请使用 numpy,因为数据集很大)

Kri*_*tta 0 python select if-statement numpy pandas

x = {“输入”:[\'A\',\'B\',\'B\',\'B\',\'B\',\'B\',\'A\', \'B\',\'B\',\'C\',\'B\',\'B\',\'C\',\'B\',\'B\',\' A\',\'B\',\'C\']}

\n

df = pd.DataFrame(x)

\n

df

\n

\xe2\x80\x9cOUTPUT\xe2\x80\x9d 列的计算条件

\n

条件(1)如果输入值A则输出A

\n

条件(2)如果输入值C则输出C

\n

条件(3.i)如果输入值 B 且 B 出现在 C 之后,则输出 C

\n

条件(3.ii)如果输入值 B 且 B 出现在 A 之后,则输出 A

\n

最终数据框

\n
cond_output = ((df["INPUT"] == "A"),\n               (df["INPUT"] == "C"),\n               ((df["INPUT"] == "B") & (df["OUTPUT"].shift(1, fill_value="A") == "A")),\n               ((df["INPUT"] == "B") & (df["OUTPUT"].shift(1, fill_value="A") == "C")))\n               \nchoice_output = ("A", "C", "A", "C")                       \n                       \n                       \ndf["OUTPUT"] = np.select(cond_output, choice_output)\ndf\n\n# KeyError: \'OUTPUT\'\n
Run Code Online (Sandbox Code Playgroud)\n

Cor*_*ien 6

用于mask隐藏带有“B”然后ffill是最后一个有效值的行:

df['OUTPUT'] = df['INPUT'].mask(df['INPUT'] == 'B').ffill()
print(df)

# Output
   INPUT OUTPUT
0      A      A
1      B      A
2      B      A
3      B      A
4      B      A
5      B      A
6      A      A
7      B      A
8      B      A
9      C      C
10     B      C
11     B      C
12     C      C
13     B      C
14     B      C
15     A      A
16     B      A
17     C      C
Run Code Online (Sandbox Code Playgroud)

或者用于where保留带有“A”或“B”的行:

df['OUTPUT'] = df['INPUT'].where(df['INPUT'].isin(['A', 'C'])).ffill()
Run Code Online (Sandbox Code Playgroud)