从字典列表创建pandas Dataframe,将字典键创建为列

时间:2017-09-01 14:55:33

标签: python list pandas dictionary dataframe

不确定标题是否足够清晰。

我有一个字典列表,我想从中创建一个数据帧。为简单起见,列表是:

list=[]

DIC1={'value': 69.0, 'time': 10, 'from': 'Mexico', 'signal_name': 'Part1'}
DIC2={'value': 65.0, 'time': 10, 'from': 'Mexico', 'signal_name': 'Part2'}
DIC3={'value': 60.0, 'time': 11, 'from': 'Mexico', 'signal_name': 'Part1'}
DIC4={'value': 67.0, 'time': 10, 'from': 'Mexico', 'signal_name': 'Part3'}
DIC5={'value': 69.0, 'time': 11, 'from': 'Mexico', 'signal_name': 'Part2'}
DIC6={'value': 70.0, 'time': 12, 'from': 'Mexico', 'signal_name': 'Part1'}
DIC7={'value': 68.0, 'time': 12, 'from': 'Mexico', 'signal_name': 'Part2'}
DIC8={'value': 71.0, 'time': 11, 'from': 'Mexico', 'signal_name': 'Part3'}
DIC9={'value': 50.0, 'time': 12, 'from': 'Mexico', 'signal_name': 'Part3'}

list=[DIC1,DIC2,DIC3,DIC4,DIC5,DIC6,DIC7,DIC8,DIC9]
#Convert to Dataframe
df=pd.DataFrame(list) 

如果我只是将字典列表转换为上面示例中的数据框,我会得到一个数据框,如:

    from    signal_name time    value
0   Mexico  Part1       10      69.0
1   Mexico  Part2       10      65.0
2   Mexico  Part1       11      60.0
3   Mexico  Part3       10      67.0
4   Mexico  Part2       11      69.0
5   Mexico  Part1       12      70.0
6   Mexico  Part2       12      68.0
7   Mexico  Part3       11      71.0
8   Mexico  Part3       12      50.0

但是我想要一个过滤后的表格,我想是一个数据透视表?类似的东西:

    time    from    part1(value)    part2(value)    part3(value)
0   10      Mexico      69.0            65.0            67.0
1   11      Mexico      60.0            69.0            71.0
2   12      Mexico      70.0            68.0            50.0

这可能吗?

2 个答案:

答案 0 :(得分:3)

借助数据透视表

df.pivot_table(index=['from','time'],columns=['signal_name'],values=['value']).reset_index()

输出:

               from time value            
signal_name              Part1 Part2 Part3
0            Mexico   10  69.0  65.0  67.0
1            Mexico   11  60.0  69.0  71.0
2            Mexico   12  70.0  68.0  50.0

如果您不希望将值作为单独的标题,则将values参数作为字符串传递,即

df.pivot_table(index=['from','time'],columns=['signal_name'],values='value').reset_index()
signal_name    from  time  Part1  Part2  Part3
0            Mexico    10   69.0   65.0   67.0
1            Mexico    11   60.0   69.0   71.0
2            Mexico    12   70.0   68.0   50.0

答案 1 :(得分:2)

来自unstack

的解决方案
df.set_index(['from','signal_name','time']).unstack(-2)
Out[437]: 
            value            
signal_name Part1 Part2 Part3
from   time                  
Mexico 10    69.0  65.0  67.0
       11    60.0  69.0  71.0
       12    70.0  68.0  50.0
相关问题