根据基于字符串的层次结构将值分配给列

时间:2020-01-23 16:12:17

标签: python pandas

我正在尝试在Pandas DataFrame中创建一个新列,在该列中将两列进行比较,并根据预定义的层次结构在两列进行比较后填充第三列。新列将基于层次结构采用两者中的较高者。层次结构从最高到最低如下:

A1
A2
A3
A4
A5  

下面显示了DataFrame df

sales_code   price_bucket_a   price_bucket_b
101          A1               A2
102          A3               A4
202          A2               A3
201          A4               A5
301          A2               A2 
302          A5               A1

我正在尝试实现的期望输出如下所示。

sales_code   price_bucket_a   price_bucket_b   price_bucket_hier
101          A1               A2               A1
102          A3               A4               A3
202          A2               A3               A2
201          A4               A5               A4
301          A2               A2               A2
302          A5               A1               A1

有问题的层次结构和DataFrame只是全部总数的一部分。

任何人都可以提供的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:5)

首先我们需要转换为类别,然后我们可以执行minmax以获得正确的答案

cat=['A1','A2','A3','A4','A5']
df[['price_bucket_a','price_bucket_b']].apply(lambda x : pd.Categorical(x, categories=cat,ordered=True )).min(axis=1)
0    A1
1    A3
2    A2
3    A4
4    A2
dtype: object

答案 1 :(得分:3)

这是IIUC的一种方法:

ix = df.filter(like='price').apply(lambda x: x.str.lstrip('A')).astype(int).idxmin(1)

df['price_bucket_hier'] = df.lookup(range(df.shape[0]), ix)

print(df)

 sales_code price_bucket_a price_bucket_b price_bucket_hier
0         101             A1             A2                A1
1         102             A3             A4                A3
2         202             A2             A3                A2
3         201             A4             A5                A4
4         301             A2             A2                A2