Python 同时使用多个列创建数据透视表
我想知道pandas.pivot\u table是否可以同时接受两列,并分别处理它们,而不是按层次进行处理 假设我有以下数据框:Python 同时使用多个列创建数据透视表,python,pandas,pivot-table,Python,Pandas,Pivot Table,我想知道pandas.pivot\u table是否可以同时接受两列,并分别处理它们,而不是按层次进行处理 假设我有以下数据框: id date day val 101 11/1/1 1 2.1 101 11/1/2 2 2.2 101 11/1/3 3 2.3 102 11/1/2 1 3.1 102 11/1/3 2 3.2 102 11/1/4 3 3.3 我希望结果是这样的: date
id date day val
101 11/1/1 1 2.1
101 11/1/2 2 2.2
101 11/1/3 3 2.3
102 11/1/2 1 3.1
102 11/1/3 2 3.2
102 11/1/4 3 3.3
我希望结果是这样的:
date day
id 11/1/1 11/1/2 11/1/3 11/1/4 1 2 3
101 2.1 2.2 2.3 NaN 2.1 2.2 2.3
102 NaN 3.1 3.2 3.3 3.1 3.2 3.3
当我执行
df.pivot_表(index='id',columns=['date','day'],values='val')
时,它将date
和day
集成到一个层次结构中,这不是我想要的。当然,我可以分别对date
和day
执行两次操作并连接结果,但有没有更方便的方法可以一次执行此操作?您可以进行2次pivot
调用和concat
启用结果
i = df.pivot('id', 'date', 'val')
j = df.pivot('id', 'day', 'val')
pd.concat([i, j], 1, keys=['date', 'day'])
date day
11/1/1 11/1/2 11/1/3 11/1/4 1 2 3
id
101 2.1 2.2 2.3 NaN 2.1 2.2 2.3
102 NaN 3.1 3.2 3.3 3.1 3.2 3.3
作为单一班轮—
c = ['date', 'day'] # add more cols as needed
pd.concat([df.pivot('id', x, 'val') for x in c], axis=1, keys=c)
date day
11/1/1 11/1/2 11/1/3 11/1/4 1 2 3
id
101 2.1 2.2 2.3 NaN 2.1 2.2 2.3
102 NaN 3.1 3.2 3.3 3.1 3.2 3.3
您可以进行2次
pivot
调用并concat
启用结果
i = df.pivot('id', 'date', 'val')
j = df.pivot('id', 'day', 'val')
pd.concat([i, j], 1, keys=['date', 'day'])
date day
11/1/1 11/1/2 11/1/3 11/1/4 1 2 3
id
101 2.1 2.2 2.3 NaN 2.1 2.2 2.3
102 NaN 3.1 3.2 3.3 3.1 3.2 3.3
作为单一班轮—
c = ['date', 'day'] # add more cols as needed
pd.concat([df.pivot('id', x, 'val') for x in c], axis=1, keys=c)
date day
11/1/1 11/1/2 11/1/3 11/1/4 1 2 3
id
101 2.1 2.2 2.3 NaN 2.1 2.2 2.3
102 NaN 3.1 3.2 3.3 3.1 3.2 3.3
一行…但是为什么你需要他们在一行
df.set_index(['id','val']).stack().to_frame('col').\
reset_index(level='val').set_index('col',append=True).\
unstack([-2,-1]).sort_index(1,level=1)
Out[69]:
val
date day
col 11/1/1 11/1/2 11/1/3 11/1/4 1 2 3
id
101 2.1 2.2 2.3 NaN 2.1 2.2 2.3
102 NaN 3.1 3.2 3.3 3.1 3.2 3.3
一行…但是为什么你需要他们在一行
df.set_index(['id','val']).stack().to_frame('col').\
reset_index(level='val').set_index('col',append=True).\
unstack([-2,-1]).sort_index(1,level=1)
Out[69]:
val
date day
col 11/1/1 11/1/2 11/1/3 11/1/4 1 2 3
id
101 2.1 2.2 2.3 NaN 2.1 2.2 2.3
102 NaN 3.1 3.2 3.3 3.1 3.2 3.3
好的,您可以进行两个单独的pivot调用,然后连接结果。好的,您可以进行两个单独的pivot调用,然后连接结果。只需在中添加
keys=['date','day']
concat@Bharath谢谢你,看起来不错。@Wen谢谢你!“有什么办法可以马上做吗?”比尔杜尔:嗯,你当然可以一行就做。编辑我的答案。只需在中添加keys=['date','day']
concat@Bharath谢谢你,看起来不错。@Wen谢谢你!“有什么办法可以马上做吗?”比尔杜尔:嗯,你当然可以一行就做。编辑了我的答案。