pandas 按id分组并查看上一行值以根据多个条件确定下一行值

eufgjt7s  于 2023-08-01  发布在  其他
关注(0)|答案(1)|浏览(146)

我希望有人能帮我解决这个问题!我在网上还没找到足够接近的东西。
样本数据:

import pandas as pd

sample_data = {
'id': [1,1,1,1,1,2,2,2,2,2],
'date_rank': [1,2,3,4,5,1,2,3,4,5],
'candidates': [1,0,0,3,0,0,0,0,2,0],
'desired_output':['New_filled','New_open','Double_open','Double_filled','New_open','New_open','Double_open','Double_open','Double_filled','New_open']
}

df = pd.DataFrame(sample_data, columns=['id', 'date_rank','candidates', 'desired_output'])
df

字符串
在sample_data输出中,“desired_output”列显示了所需的结果:

id  date_rank   candidates  desired_output
0   1   1           1           New_filled
1   1   2           0           New_open
2   1   3           0           Double_open
3   1   4           3           Double_filled
4   1   5           0           New_open
5   2   1           0           New_open
6   2   2           0           Double_open
7   2   3           0           Double_open
8   2   4           2           Double_filled
9   2   5           0           New_open


date_rank列除了第一个条目外并不重要。
第一个条目将始终是“新的”,但可以是“填充”或“打开”。当0名候选人被雇用时,它是打开的,如果一个或多个候选人被雇用,它是关闭的。这也适用于其余条目。
如果一个条目被填充,则下一行将始终是新的。
如果一个条目是因为没有候选人而开放的,那么下一个条目将始终是双倍的。
如果你看第四行,你会发现,只要前一行打开,条目就可以被双重填充。
在desired_ouptut列中有四个可能的值/条件。我可以用更少的条件来实现这一点,但不能用四个条件,特别是当值取决于前一行的值时。

kfgdxczn

kfgdxczn1#

您可以在当前行上使用两个简单的条件式,其中numpy.where和前一行(groupby.shift):

m = df['candidates'].eq(0)

df['output'] = pd.Series(np.where(m.groupby(df['id']).shift(fill_value=False),
                                  'Double_', 'New_'), index=df.index
                         ).add(np.where(m, 'open', 'filled'))

字符串
numpy中:

m = df['candidates'].eq(0)

a1 = np.where(m.groupby(df['id']).shift(fill_value=False), 'Double_', 'New_')
a2 = np.where(m, 'open', 'filled')
df['output'] = np.core.defchararray.add(a1, a2)


输出量:

id  date_rank  candidates desired_output         output
0   1          1           1     New_filled     New_filled
1   1          2           0       New_open       New_open
2   1          3           0    Double_open    Double_open
3   1          4           3  Double_filled  Double_filled
4   1          5           0       New_open       New_open
5   2          1           0       New_open       New_open
6   2          2           0    Double_open    Double_open
7   2          3           0    Double_open    Double_open
8   2          4           2  Double_filled  Double_filled
9   2          5           0       New_open       New_open

相关问题