如何将平面 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.10 和 pandas 0.16.1。
【问题讨论】:
【参考方案1】:我假设您想使用所有['W', 'X', 'Y', 'Z']
columns
,并且只使用date
列之一。如果是这样,下面应该可以让您到达那里 - 如果您首先应用 set_index
然后 unstack
,pandas
会自动创建 MultiIndex
,然后您可以通过 level
和 sort
自动创建 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 中的列?