我有以下问题:我正在用pandas数据帧分析实验数据,因为数据本身有点复杂,最后我得到了类似这样的东西,结果是一本包含字典的字典:
data = {aa: {1: 4, 2: 19, 3: 70, 4: 20}, bb: {1: 9, 2: 3, 3: 65, 4: 20}}当尝试从其中获取熊猫数据帧时,如下所示:
df = pd.DataFrame(list(data.items()), columns=['code', 'week1_2'])我得到的结果如下:
0 ah03Di {'1': 11, '2': 11, '3': 12, '4': 14}
1 an02Ka {'1': 6, '2': 11, '3': 7, '4': 9}但我更想要(或需要)的是这样的东西
0 ah03Di 11
1 ah303Di 11
2 ah03Di 12
3 ah03Di 14
4 an02ka 6
5 an02Ka 11
6 an02ka 7
7 an02ka 9 有没有简单的方法可以做到这一点?
发布于 2018-05-11 01:39:57
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对于你的名字和这两列:
(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发布于 2018-05-11 01:36:54
如果性能很重要,请使用triples的list comprehension:
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:
df = pd.concat({k: pd.Series(v) for k, v in data.items()}).reset_index()
df.columns = list('abc')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列:
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'))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发布于 2018-05-11 01:45:10
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 20https://stackoverflow.com/questions/50278455
复制相似问题