Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 同时使用多个列创建数据透视表_Python_Pandas_Pivot Table - Fatal编程技术网

Python 同时使用多个列创建数据透视表

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

我想知道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                            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谢谢你!“有什么办法可以马上做吗?”比尔杜尔:嗯,你当然可以一行就做。编辑了我的答案。