Pandas: 将列转换为表头

6

我试图将列中的值转换为列标题,但保留其余数据。以下是我的完整代码以及最接近我要求的结果。唯一的问题是我不知道如何保留 end 列:

import pandas as pd

starts = pd.date_range(start = '1/1/2017', freq = '31d', periods = 4).tolist()
ends = pd.date_range(start = '1/31/2017', freq = '31d', periods = 4).tolist()

df = pd.DataFrame({ 'id':['XXX','XXX','XXX','XXX','YYY','YYY','YYY','YYY'], 
                    'start': starts + starts,
                    'end': ends + ends,
                    'type':['car','car','car','car','truck','truck','truck','truck']
                    }, columns = ['id','start','end','type'])

原始数据帧:

    id      start        end   type
0  XXX 2017-01-01 2017-01-31    car
1  XXX 2017-02-01 2017-03-03    car
2  XXX 2017-03-04 2017-04-03    car
3  XXX 2017-04-04 2017-05-04    car
4  YYY 2017-01-01 2017-01-31  truck
5  YYY 2017-02-01 2017-03-03  truck
6  YYY 2017-03-04 2017-04-03  truck
7  YYY 2017-04-04 2017-05-04  truck

我的最近的转折点尝试:

(此句已翻译)
print df.pivot(index = 'start', columns = 'id', values = 'type').reset_index()

当前输出:

id      start  XXX    YYY
0  2017-01-01  car  truck
1  2017-02-01  car  truck
2  2017-03-04  car  truck
3  2017-04-04  car  truck

期望输出:

        start         end  XXX    YYY
0  2017-01-01  2017-01-31  car  truck
1  2017-02-01  2017-03-03  car  truck
2  2017-03-04  2017-04-03  car  truck
3  2017-04-04  2017-05-04  car  truck

我尝试了这个方法这个方法,但都没有成功。
希望能得到帮助,谢谢。
2个回答

7
pd.pivot_table(df,index=['start','end'],columns='id',values='type',aggfunc='sum').reset_index()
Out[1587]: 
id       start         end  XXX    YYY
0   2017-01-01  2017-01-31  car  truck
1   2017-02-01  2017-03-03  car  truck
2   2017-03-04  2017-04-03  car  truck
3   2017-04-04  2017-05-04  car  truck

很好,我想应该优先选择使用数据透视表。 - Vaishali
@Vaishali - 你为什么说pivot_table会更好呢? - elPastor
因为你有一个能完成相同功能的函数,所以可能更符合 Python 风格。 - Vaishali
@pshep123,在结尾处有aggfunc,当您使用unstack时,也可以通过groupby对值进行聚合,但这是多一步操作...而且groupby是一个耗时的函数。 - BENY

5
使用set_index和unstack函数,
df.set_index(['start', 'end', 'id']).type.unstack().reset_index()



id  start       end         XXX YYY
0   2017-01-01  2017-01-31  car truck
1   2017-02-01  2017-03-03  car truck
2   2017-03-04  2017-04-03  car truck
3   2017-04-04  2017-05-04  car truck

我稍微更新了问题,以删除“id”列名作为索引。解决方案是在末尾添加.rename_axis(None, axis = 1) - elPastor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接