pandas 多列panda数据透视表

pnwntuvh  于 2022-11-20  发布在  其他
关注(0)|答案(3)|浏览(172)
    • 输入 表格 * *

| 个人 电脑|收入|学历|1 岁 至 20 岁|热 交换 器|
| - -| - -| - -| - -| - -|
| a1001 型|收入 _1|教育 _1|一 个|一 个|
| a1003 型|收入 _2|教育 _2|第 0 页|2 个|
| a1001 型|收入 _3|教育 _2|五 个|2 个|
| a1002 型|收入 _2|教育 _2|一 个|五 个|
| a1003 型|收入 _1|教育 _2|三 个|四 个|

    • 所 需 输出 * *

| 个人 电脑|收入 _1|收入 _2|收入 _3|教育 _1|教育 _2| 1 岁 至 20 岁|热 交换 器|
| - -| - -| - -| - -| - -| - -| - -| - -|
| a1001 型|一 个|第 0 页|一 个|一 个|一 个|六 个|1.5 分|
| a1002 型|第 0 页|一 个|第 0 页|第 0 页|一 个|一 个|五 个|
| a1003 型|一 个|一 个|第 0 页|第 0 页|2 个|三 个|三 个|

      • pcd 为 指数 , 收入 1 、 收入 2 、 收入 3 、 教育 1 、 教育 2 、 年龄 合计 为 总和 , TG 合计 为 平均 值 。 * * *
pd.pivot_table(df, index=['pcd', 'age1to_20'],
           aggfunc={'INCOME':sum,'Education'=sum,'age1to_20'=sum,'TG':avg},fill_value=0)

中 的 每 一 个
已 尝试 上述 代码 , 但 未 成功

hs1ihplo

hs1ihplo1#

您可以先使用melt,然后使用pivot_table进行整形,最后使用groupby.agg合并“pcd”:

agg_funcs = {'TG': 'mean', 'pcd': 'first'}

out = (df
   .melt(['pcd', 'age1to_20', 'TG'])
   .assign(v=1)
   .pivot_table(index=['pcd', 'age1to_20', 'TG'], columns='value',
                values='v', fill_value=0)
   .reset_index().rename_axis(columns=None)
   .pipe(lambda d: d.groupby('pcd', as_index=False)
                    .agg({c: agg_funcs.get(c, 'sum') for c in d.columns}))
)

输出量:

pcd  age1to_20   TG  Education_1  Education_2  INCOME_1  INCOME_2  INCOME_3
0  a1001          6  1.5            1            1         1         0         1
1  a1002          1  5.0            0            1         0         1         0
2  a1003          3  3.0            0            2         1         1         0
mctunoxg

mctunoxg2#

或者,可以使用交叉表和groupby:

x=pd.crosstab(df['pcd'],columns=df['INCOME'])
print(x)
'''
INCOME  INCOME_1  INCOME_2  INCOME_3
pcd                                 
a1001          1         0         1
a1002          0         1         0
a1003          1         1         0
'''

y=pd.crosstab([df['pcd']],columns=[df['Education']])
z=df.groupby('pcd').agg({'age1to_20':'sum','TG':'mean'})
final=x.join([y,z])
print(final)
'''
       INCOME_1  INCOME_2  INCOME_3  Education_1  Education_2  age1to_20   TG
pcd                                                                          
a1001         1         0         1            1            1          6  1.5
a1002         0         1         0            0            1          1  5.0
a1003         1         1         0            0            2          3  3.0
'''
8yparm6h

8yparm6h3#

您还需要指定值的来源以及哪些列将指定新的列名。
而且,我不太清楚你的价值观是从哪里来的。
但它看起来像这样,例如,

pd.pivot_table(df, index=['pcd', 'age1to_20'], 
           values=['age1to_20']
           columns=['income', 'education']
           aggfunc={'INCOME':sum,'TG':avg},fill_value=0)

相关问题