首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Pandas数据帧来自包含字典的字典

Python Pandas数据帧来自包含字典的字典
EN

Stack Overflow用户
提问于 2018-05-11 01:33:55
回答 3查看 51关注 0票数 1

我有以下问题:我正在用pandas数据帧分析实验数据,因为数据本身有点复杂,最后我得到了类似这样的东西,结果是一本包含字典的字典:

代码语言:javascript
复制
    data = {aa: {1: 4, 2: 19, 3: 70, 4: 20}, bb: {1: 9, 2: 3, 3: 65, 4: 20}}

当尝试从其中获取熊猫数据帧时,如下所示:

代码语言:javascript
复制
    df = pd.DataFrame(list(data.items()), columns=['code', 'week1_2'])

我得到的结果如下:

代码语言:javascript
复制
    0   ah03Di  {'1': 11, '2': 11, '3': 12, '4': 14}
    1   an02Ka     {'1': 6, '2': 11, '3': 7, '4': 9}

但我更想要(或需要)的是这样的东西

代码语言:javascript
复制
    0   ah03Di  11 
    1   ah303Di 11
    2   ah03Di  12
    3   ah03Di  14
    4   an02ka  6
    5   an02Ka  11
    6   an02ka  7
    7   an02ka  9   

有没有简单的方法可以做到这一点?

EN

回答 3

Stack Overflow用户

发布于 2018-05-11 01:39:57

代码语言:javascript
复制
import pandas as pd  
pd.DataFrame(data).stack().reset_index()

   level_0 level_1   0
0        1      aa   4
1        1      bb   9
2        2      aa  19
3        2      bb   3
4        3      aa  70
5        3      bb  65
6        4      aa  20
7        4      bb  20

对于你的名字和这两列:

代码语言:javascript
复制
(pd.DataFrame(data).stack().reset_index().drop(columns='level_0')
  .rename(columns={'level_1': 'code', 0: 'week1_2'}))
#  code  week1_2
#0   aa        4
#1   bb        9
#2   aa       19
#3   bb        3
#4   aa       70
#5   bb       65
#6   aa       20
#7   bb       20
票数 3
EN

Stack Overflow用户

发布于 2018-05-11 01:36:54

如果性能很重要,请使用tripleslist comprehension

代码语言:javascript
复制
data = {'aa': {1: 4, 2: 19, 3: 70, 4: 20}, 'bb': {1: 9, 2: 3, 3: 65, 4: 20}}

L = sorted([(k,k1,v1) for k,v in data.items() for k1,v1 in v.items()], 
            key=lambda x: (x[0], x[1]))
print (L)
[('aa', 1, 4), ('aa', 2, 19), ('aa', 3, 70), ('aa', 4, 20), 
 ('bb', 1, 9), ('bb', 2, 3), ('bb', 3, 65), ('bb', 4, 20)]

df = pd.DataFrame(L, columns=list('abc'))

或者使用Series contructor的concat

代码语言:javascript
复制
df = pd.concat({k: pd.Series(v) for k, v in data.items()}).reset_index()
df.columns = list('abc')

代码语言:javascript
复制
print (df)
    a  b   c
0  aa  1   4
1  aa  2  19
2  aa  3  70
3  aa  4  20
4  bb  1   9
5  bb  2   3
6  bb  3  65
7  bb  4  20

如果只需要2列:

代码语言:javascript
复制
L = sorted([(k,v1) for k,v in data.items() for k1,v1 in v.items()], 
            key=lambda x: (x[0], x[1]))
print (L)
[('aa', 4), ('aa', 19), ('aa', 20), ('aa', 70),
 ('bb', 3), ('bb', 9), ('bb', 20), ('bb', 65)]

df = pd.DataFrame(L, columns=list('ab'))

代码语言:javascript
复制
df = (pd.concat({k: pd.Series(v) for k, v in data.items()})
        .reset_index(level=1, drop=True)
        .reset_index())
df.columns = ['a','b']
print (df)
    a   b
0  aa   4
1  aa  19
2  aa  70
3  aa  20
4  bb   9
5  bb   3
6  bb  65
7  bb  20
票数 2
EN

Stack Overflow用户

发布于 2018-05-11 01:45:10

代码语言:javascript
复制
pd.DataFrame(data).pipe(
    lambda d: pd.DataFrame(dict(
        code=np.tile(d.columns, len(d)),
        week1_2=d.values.ravel()
    ))
)

  code  week1_2
0   aa        4
1   bb        9
2   aa       19
3   bb        3
4   aa       70
5   bb       65
6   aa       20
7   bb       20
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50278455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档