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

ttvkxqim  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(79)

x = {“输入”:'A','B ','B','B ','B','B ','B','B ','C','B ','B','C ','B','B ','A','B ','C']}
df = pd.DataFrame(x)
DF

  • “OUTPUT”列的计算条件 *

条件(1)如果输入值A,则输出A
条件(2)如果输入值C,则输出C
条件(3.i)如果输入值B和B出现在C之后,则输出C
条件(3.ii)如果输入值B和B出现在A之后,则输出A
x1c 0d1x的数据

cond_output = ((df["INPUT"] == "A"),
               (df["INPUT"] == "C"),
               ((df["INPUT"] == "B") & (df["OUTPUT"].shift(1, fill_value="A") == "A")),
               ((df["INPUT"] == "B") & (df["OUTPUT"].shift(1, fill_value="A") == "C")))
               
choice_output = ("A", "C", "A", "C")                       
                       
                       
df["OUTPUT"] = np.select(cond_output, choice_output)
df

# KeyError: 'OUTPUT'

字符串

qni6mghb

qni6mghb1#

使用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

字符串
或者使用where来保留包含“A”或“B”的行:

df['OUTPUT'] = df['INPUT'].where(df['INPUT'].isin(['A', 'C'])).ffill()

相关问题