我有以下DataFrame:
Segments Airline_pct_tesco Airline_pct_asda food_pct_tesco food_pct_asda Airline_diff food_diff
A 1 2 4 2 -1 2
B 2 2 4 4 0 0
c 10 5 12 10 5 2我想把它转换成这样的格式:
Segments Category Asda% Tesco% Diff%
A Airline 2 1 -1
b Food 4 4 0
c Airline 5 10 5
A Food 2 4 2(仅部分显示)。注类别是没有“_pct_tesco”、“_diff”或“_pct_asda”的中文名称。
我不知道该如何做-我尝试过转换,但我只是不知道如何才能以一种任何用户都很容易使用的方式。我在熊猫身上做这件事,我不知道怎么开始!Asda%与“_pct_asda”列相关,对于diff和tesco列则相同。
发布于 2021-07-08 14:33:17
让我们尝试set_index保存列,然后在列上使用str.extract创建一个MultiIndex,根据后缀列表前的值创建MultiIndex,然后stack使用长表单。
new_df = df.set_index('Segments')
# Define allowed suffixes here
suffixes = ['_pct_asda', '_pct_tesco', '_diff']
# Extract Values
new_df.columns = (
pd.MultiIndex.from_frame(
new_df.columns.str.extract(rf'(.*?)({"|".join(suffixes)})'),
names=['Category', None]
)
)
new_df = new_df.stack(0)new_df
_diff _pct_asda _pct_tesco
Segments Category
A Airline -1 2 1
food 2 2 4
B Airline 0 2 2
food 0 4 4
c Airline 5 5 10
food 2 10 12为了获得更清晰的输出,添加reset_index + rename来修复列名和索引,并重新排序列。
new_df = new_df.reset_index().rename(columns={
'_pct_asda': 'Asda%',
'_pct_tesco': 'Tesco%',
'_diff': 'Diff%'
})[['Segments', 'Category', 'Asda%', 'Tesco%', 'Diff%']]new_df
Segments Category Asda% Tesco% Diff%
0 A Airline 2 1 -1
1 A food 2 4 2
2 B Airline 2 2 0
3 B food 4 4 0
4 c Airline 5 10 5
5 c food 10 12 2https://stackoverflow.com/questions/68303455
复制相似问题