python - 旋转数据框后检索正常数据框

标签 python pandas pivot

<分区>

我有一个 pandas 数据框,它是旋转的结果。它有多个索引。我想从这个旋转的 df 中得到一个“正常”的数据框......这样我就可以在新的 df 上做一些正常的操作。

这是一个示例:我的旋转数据框如下所示:

                      feature_value
feature_type          f1  f2  f3  f4  f5
time         name
2016-05-10   Clay     0   1   30   4  40
2016-05-10   John     0   4   10   4  66
2016-05-10   Mary     0   1   40   4  46
2016-05-10   Boby     2   0   30   4  59
2016-05-10   Lucy     5   8   20   4  41

以下是我想要的新 df:

time         name     f1  f2  f3  f4  f5
2016-05-10   Clay     0   1   30   4  40
2016-05-10   John     0   4   10   4  66
2016-05-10   Mary     0   1   40   4  46
2016-05-10   Boby     2   0   30   4  59
2016-05-10   Lucy     5   8   20   4  41

我该怎么做?

pivoted_df.to_dict() 看起来像这样:

{('feature_value', 'f1'): {(Timestamp('2016-05-10'), 'Clay'): 0, (Timestamp('2016-05-10'), 'John'): 0, (Timestamp('2016-05-10'), 'Mary'): 0, (Timestamp('2016-05-10'), 'Boby'): 2, (Timestamp('2016-05-10'), 'Lucy'): 5}, ('feature_value', 'f2'): {(Timestamp('2016-05-10'), 'Clay'): 1, (Timestamp('2016-05-10'), 'John'): 4, (Timestamp('2016-05-10'), 'Mary'): 1, (Timestamp('2016-05-10'), 'Boby'): 0, (Timestamp('2016-05-10'), 'Lucy'): 8}, ('feature_value', 'f3'): {(Timestamp('2016-05-10'), 'Clay'): 30, (Timestamp('2016-05-10'), 'John'): 10, (Timestamp('2016-05-10'), 'Mary'): 40, (Timestamp('2016-05-10'), 'Boby'): 30, (Timestamp('2016-05-10'), 'Lucy'): 20}, ('feature_value', 'f4'): {(Timestamp('2016-05-10'), 'Clay'): 4, (Timestamp('2016-05-10'), 'John'): 4, (Timestamp('2016-05-10'), 'Mary'): 4, (Timestamp('2016-05-10'), 'Boby'): 4, (Timestamp('2016-05-10'), 'Lucy'): 4}, ('feature_value', 'f5'): {(Timestamp('2016-05-10'), 'Clay'): 40, (Timestamp('2016-05-10'), 'John'): 66, (Timestamp('2016-05-10'), 'Mary'): 46, (Timestamp('2016-05-10'), 'Boby'): 59, (Timestamp('2016-05-10'), 'Lucy'): 41}}

最佳答案

调用 pivot_table 时,确保指定了 values 参数:

df.pivot_table(index=['time', 'name'], columns=['feature_type'], 
               values='feature_value')

如果没有 values='feature_value',您将获得一个 MultiIndex 列索引(可能)具有单个外部级别,例如 'feature_value'

df.pivot_table(index=['time', 'name'], ...) 还会返回一个 DataFrame,其中包含一个包含 time 的 MultiIndex 行索引和名称 级别。要使这些索引级别成为常规列,请调用 reset_index():

result = df.pivot_table(index=['time', 'name'], 
                        columns=['feature_type'],
                        values='feature_value').reset_index()

例如,

import numpy as np
import pandas as pd
np.random.seed(2016)

N = 10
df = pd.DataFrame(
    {'time': np.random.choice(pd.date_range('2016-05-10', '2016-05-12'), size=N),
     'name': np.random.choice(['Clay', 'John', 'Mary', 'Boby', 'Lucy'], size=N),
     'feature_type': np.random.choice(['f{}'.format(i) for i in range(1,6)], size=N),
     'feature_value': np.random.randint(100, size=N)})

orig = df.pivot_table(index=['time', 'name'], columns=['feature_type'])
print(orig)

alt = df.pivot_table(index=['time', 'name'], 
                     columns=['feature_type'],
                     values='feature_value').reset_index()
alt.columns.name = None
print(alt)

orig 看起来像这样:

                feature_value                        
feature_type               f1    f2    f3    f4    f5
time       name                                      
2016-05-10 John           NaN  50.0   NaN   NaN  91.0
           Lucy           NaN   NaN   NaN  28.0   NaN
           Mary           NaN   NaN  19.0   NaN  27.0
2016-05-11 Clay           2.0   NaN   NaN   NaN   NaN
           Lucy          24.0   NaN   NaN   NaN   NaN
2016-05-12 Boby           NaN  16.0   NaN   NaN   NaN
           John           NaN   NaN   NaN   NaN  62.0
           Mary           NaN   NaN   NaN  84.0   NaN

虽然 alt 看起来像

        time  name    f1    f2    f3    f4    f5
0 2016-05-10  John   NaN  50.0   NaN   NaN  91.0
1 2016-05-10  Lucy   NaN   NaN   NaN  28.0   NaN
2 2016-05-10  Mary   NaN   NaN  19.0   NaN  27.0
3 2016-05-11  Clay   2.0   NaN   NaN   NaN   NaN
4 2016-05-11  Lucy  24.0   NaN   NaN   NaN   NaN
5 2016-05-12  Boby   NaN  16.0   NaN   NaN   NaN
6 2016-05-12  John   NaN   NaN   NaN   NaN  62.0
7 2016-05-12  Mary   NaN   NaN   NaN  84.0   NaN

关于python - 旋转数据框后检索正常数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37444523/

相关文章:

Python 如何获取设置位

python - 如何迭代 Django 模板标签中的 ManyToMany 字段?

python - 在 Pandas Dataframe 中估算缺失的日期

r - 所有列的从长到宽

mysql - 如何在 MySQL 中返回数据透视表输出?

pandas - 如何在 Pandas 中将列转换为行?

python - 混合使用 Clojure 和 Python 是个好主意吗?

python - 为什么使用键盘时我的代码循环两次?

python - 使用 pandas 寻找 90 天前的现有客户

python - 基于日历函数创建新列