pandas 数据框中的 group by 优先级

vin*_*trx 1 pandas

我需要从 Col_2 中选择字母到 new_col 中。当有 2 个值:A、B 时,我想根据 Col_2 中的值给予优先级。在有由 col_1 确定的 2 个值的情况下,我需要为 A 提供比 B 更多的选择优先级。


Col_1      Col_2        new_col
1            A             A
1            B             A
2            B             B 
3            A             A 
4            B             A
4            A             A
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 5

通过在列参数中排序来使用具有设置优先级的有序分类categories,然后用于GroupBy.transform返回与由值填充的原始大小相同的系列max

df['Col_2'] = pd.Categorical(df['Col_2'], ordered=True, categories=['B','A'])

#another solution for lower pandas versions
#df['Col_2'] = pd.CategoricalIndex(df['Col_2'], ordered=True, categories=['B','A'])

df['new_col1'] = df.groupby('Col_1')['Col_2'].transform('max')
print (df)
   Col_1 Col_2 new_col new_col1
0      1     A       A        A
1      1     B       A        A
2      2     B       B        B
3      3     A       A        A
4      4     B       A        A
5      4     A       A        A
Run Code Online (Sandbox Code Playgroud)

另一个具有Series.map优先级的双字典解决方案:

d = {'A':2, 'B':1}
#swap keys with values
d1 = {v:k for k, v in d.items()}
df['new_col1'] = df['Col_2'].map(d).groupby(df['Col_1']).transform('max').map(d1)
print (df)
   Col_1 Col_2 new_col new_col1
0      1     A       A        A
1      1     B       A        A
2      2     B       B        B
3      3     A       A        A
4      4     B       A        A
5      4     A       A        A
Run Code Online (Sandbox Code Playgroud)