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\']}
\ndf = pd.DataFrame(x)
\ndf
\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\ncond_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\'\nRun Code Online (Sandbox Code Playgroud)\n
用于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)