首页 > 解决方案 > 成对转置多列 - pandas python

问题描述

我想转置多列成对的两个

我有以下列:

user_id', 'fullname', 'email', 'handle', 'audience_ethnicities_code0', 'audience_ethnicities_weight0', 'audience_ethnicities_code1', 'audience_ethnicities_weight1', 'audience_ethnicities_code2', 'audience_ethnicities_weight2', 'audience_ethnicities_code3', 'audience_ethnicities_weight3'

其中代码和重量是相关的,例如:

user_id = ABCD

'audience_ethnicities_code0' = asian;
'audience_ethnicities_weight0' = 0.4 

'audience_ethnicities_code1' = african; 
'audience_ethnicities_weight1' = 0.2

'audience_ethnicities_code2' = white;
'audience_ethnicities_weight2' = 0.2 

'audience_ethnicities_code3' = hispanic; 
'audience_ethnicities_weight3' = 0.2

总权重 = 1,用户 ABCD 的受众是 40% 的亚洲人,20% 的非洲人等。我想要的是audience_ethnicities_code_n 在列和行中audience_ethnicities_weight_n 为每个用户提供种族 ()

我尝试了这个查询,但它给了我一个混乱的结果:

df1 = df.pivot_table(index=['user_id', 'fullname', 'email', 'handle'], 
                    columns=['audience_ethnicities_code0', 'audience_ethnicities_code1', 'audience_ethnicities_code2', 'audience_ethnicities_code3'], 
                    values=['audience_ethnicities_weight0', 'audience_ethnicities_weight1', 'audience_ethnicities_weight2', 'audience_ethnicities_weigh3'], aggfunc=lambda x: ' '.join(str(v) for v in x))

df1

有任何想法吗?

标签: pythonpandaspivottranspose

解决方案


我会迭代地对每一列进行数据透视,然后按索引合并数据框。

这里有一个例子:

from functools import reduce

index = ['user_id', 'fullname', 'email', 'handle']

dfList = []
for i in range(3):
  dfList.append(df.pivot_table(index=index, 
                               columns='audience_ethnicities_code{}'.format(i), 
                               values='audience_ethnicities_weight{}'.format(i))
                  .rename_axis(None, axis=1)
                  .reset_index())

reduce(lambda x, y: pd.merge(x, y, on=index), dfList)

推荐阅读