将列中的类别展开到pandas中的列名称

时间:2017-05-24 19:57:01

标签: python pandas

我试图扩展(不确定它是否是正确的词)某些分类 使用pandas将数据分成列。

我们说我有以下数据框:

df = pandas.DataFrame({'name': ['john', 'john', 'louis', 'louis'], 
                       'day':['a', 'b', 'a', 'b'], 'oranges':[10, 23, 15, 5],
                       'apple': [5, 4, 1, 3]})

生成此表:

       apple day   name  oranges
    0       5  a   john       10
    1       4  b   john       23
    2       1  a   louis      15
    3       3  b   louis       5

我想使用一些pandas方法来生成这样的表:

   apple_a apple_b name  oranges_a  oranges_b
 0       5       4  john         10         23
 1       1       3  louis        15          5

到目前为止,我已尝试过:

df.pivot('name', columns='day')

       apple        oranges
   day        a  b        a   b
   name
   john       5  4        10  23
   louis      1  3        15   5

我的问题是:如何使用Pandas基于分类信息拆分数据并创建更多列?

提前致谢,

Rhenan

3 个答案:

答案 0 :(得分:2)

让我们尝试使用set_indexstackunstack,然后使用mapjoin将多索引列映射到单元格级别:< / p>

df.set_index(['name','day']).stack().unstack([2,1])
df_1.columns = df_1.columns.map('_'.join)
print(df_1)

输出:

       apple_a  oranges_a  apple_b  oranges_b
name                                         
john         5         10        4         23
louis        1         15        3          5

答案 1 :(得分:2)

您已经获得了所需的输出,您需要格式化列名称

df = df.pivot('name', columns='day')
df.columns = ['_'.join(col).strip() for col in df.columns.values]
df = df.reset_index()

    name    apple_a apple_b oranges_a   oranges_b
0   john    5       4       10          23
1   louis   1       3       15          5

答案 2 :(得分:1)

非常感谢你们! 根据你的答案,我有一个代码可以解决这个问题:

n_df = df.pivot('name', columns='day')
n_df.columns = n_df.columns.map('_'.join)

输出:

       apple_a  apple_b  oranges_a  oranges_b
  name
  john       5        4         10         23
  louis      1        3         15          5

再次感谢!