如何将平面 DataFrame 对象转换为具有多个列级别且也按特定维度分组的 DataFrame 对象?

Posted

技术标签:

【中文标题】如何将平面 DataFrame 对象转换为具有多个列级别且也按特定维度分组的 DataFrame 对象?【英文标题】:How do I convert a flat DataFrame object to a DataFrame object with multiple column levels that is also grouped by a specific dimension? 【发布时间】:2016-03-16 12:35:21 【问题描述】:

我想转换这个:

          W         X         Y         Z       tdate tdim  stringdate
0  0.335737 -0.380237 -0.473996 -0.000448  2015-11-20    c  2015-11-20
1 -0.092511  1.149210 -0.834495 -0.585204  2015-05-25    c  2015-05-25
2  1.425946  1.293430 -0.545142  0.287451  2015-12-17    b  2015-12-17
3 -0.199412  1.011220  0.400355  0.470182  2015-03-21    c  2015-03-21
4  2.265234 -0.314174  0.684593 -1.360268  2015-12-23    b  2015-12-23
5 -0.192996  0.150177 -0.684978  0.464223  2015-11-19    b  2015-11-19
6 -1.089473 -1.375843 -0.901250 -0.775122  2015-07-25    c  2015-07-25
7 -0.572807 -2.484145 -2.339342 -0.263439  2015-05-31    a  2015-05-31

对此(使用实际数据而不是零占位符):

date    2015-11-20    2015-05-25    2015-12-17    2015-03-21    2015-12-23     \
metrics          W  X          W  X          W  X          W  X          W  X   
tdim                                                                            
a                0  0          0  0          0  0          0  0          0  0   
b                0  0          0  0          0  0          0  0          0  0   
c                0  0          0  0          0  0          0  0          0  0   

date    2015-11-19    2015-07-25    2015-05-31     
metrics          W  X          W  X          W  X  
tdim                                               
a                0  0          0  0          0  0  
b                0  0          0  0          0  0  
c                0  0          0  0          0  0  

我浏览了Pandas MultiIndexes 并自己创建了一个。这就是我到达后一个 DataFrame 的方式,但我没有在该文档中看到他重新索引现有 DataFrame 以具有多个列级别的示例。

我看过这个Pandas: add a column to a multiindex column dataframe 和pandas dataframe select columns in multiindex。这些内容很有见地,但对本案例没有特别帮助。

我没有尝试过蛮力解决方案(即使用循环手动填充数据)。

我正在使用 Python 2.7.10pandas 0.16.1

【问题讨论】:

【参考方案1】:

我假设您想使用所有['W', 'X', 'Y', 'Z']columns,并且只使用date 列之一。如果是这样,下面应该可以让您到达那里 - 如果您首先应用 set_index 然后 unstackpandas 会自动创建 MultiIndex,然后您可以通过 levelsort 自动创建 swap希望:

df.columns.name = 'metrics'    
df = df.set_index(['tdate', 'tdim']).drop('stringdate', axis=1).unstack('tdate')
df = df.swaplevel(0,1,axis=1).sort_index(axis=1)

     tdate    11/19/15                                11/20/15                      \
metrics         W         X         Y         Z         W         X         Y   
tdim                                                                            
a             NaN       NaN       NaN       NaN       NaN       NaN       NaN   
b       -0.192996  0.150177 -0.684978  0.464223       NaN       NaN       NaN   
c             NaN       NaN       NaN       NaN  0.335737 -0.380237 -0.473996   

tdate             12/17/15             ...       5/25/15            5/31/15  \
metrics        Z         W        X    ...             Y        Z         W   
tdim                                   ...                                    
a            NaN       NaN      NaN    ...           NaN      NaN -0.572807   
b            NaN  1.425946  1.29343    ...           NaN      NaN       NaN   
c        -1/1/04       NaN      NaN    ...     -0.834495  -1/1/04       NaN   

tdate                                    7/25/15                                
metrics         X         Y          Z         W         X        Y          Z  
tdim                                                                            
a       -2.484145 -2.339342  -0.263439       NaN       NaN      NaN        NaN  
b             NaN       NaN        NaN       NaN       NaN      NaN        NaN  
c             NaN       NaN        NaN -1.089473 -1.375843 -0.90125  -0.775122 

【讨论】:

这很好用。我显然需要更多地研究索引 DataFrame 对象。

以上是关于如何将平面 DataFrame 对象转换为具有多个列级别且也按特定维度分组的 DataFrame 对象?的主要内容,如果未能解决你的问题,请参考以下文章

将具有不同大小向量的列表转换为平面向量

如何将具有 Decimal 的 spark DataFrame 转换为具有相同精度的 BigDecimal 的 Dataset?

Spark:如何从具有属性的多个嵌套 XML 文件转换为 Data Frame 数据

如何将 Pandas 系列中的多个字典键转换为 DataFrame 中的列?

如何将可变长度列表的 Pandas DataFrame 列(或系列)转换为固定宽度的 DataFrame [重复]

如何将平面/关系表转换为 BigQuery 中的键/值对表?