我正在尝试在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只是全部总数的一部分。
任何人都可以提供的任何帮助将不胜感激。
答案 0 :(得分:5)
首先我们需要转换为类别,然后我们可以执行min
或max
以获得正确的答案
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