将字典列表展平为数据框列
Flatten list of dictionaries into dataframe columns
我有以下包含字典列表的数据
data= [
{'Time': 18057610.0,
'Flux': [{'V0': -1.4209e-15},
{'V1': 2.7353e-16},
{'V2': 1.1935e-15},
{'V3': 1.1624},
{'V4': -6.1692e-15},
{'V5': 3.2218e-15}]},
{'Time': 18057620.4,
'Flux': [{'V0': 2.4377e-16},
{'V1': -6.2809e-15},
{'V2': 1.6456e-15},
{'V3': 1.1651},
{'V4': 1.7147e-15},
{'V5': 9.8872e-16}]},
{'Time': 18057631.1,
'Flux': [{'V0': 4.1124e-15},
{'V1': 1.5598e-15},
{'V2': -2.325e-16},
{'V3': 1.1638},
{'V4': -3.9983e-15},
{'V5': 4.459e-16}]}]
我想得到这样的东西:
preferred_df
:
V0 V1 ... V4 V5
Time ...
18057610.0 -1.420900e-15 2.735300e-16 ... -6.169200e-15 3.221800e-15
18057620.4 2.437700e-16 -6.280900e-15 ... 1.714700e-15 9.887200e-16
18057631.1 4.112400e-15 1.559800e-15 ... -3.998300e-15 4.459000e-16
我想出了以下代码来达到目的:
df = pd.DataFrame(data).explode('Flux').reset_index(drop=True)
df = df.join(pd.DataFrame(df.pop('Flux').values.tolist())).groupby('Time').sum()
但是,我不想使用 groupby
和 sum()
。在展平字典并获得 preferred_df
时,还有哪些其他方法(字典理解?)可以在不获取 NaN 值的情况下展平 "Flux"
列?我尝试了 json_normalize()
但得到了相同的 NaN 并且需要使用 groupby()
和 sum()
.
基于接受的回答:
这是 Andrej Kesely 在列表理解中的字典理解的已接受答案的扩展 for loop
版本:
list=[]
index=[]
for d in data:
dict={}
idx=d['Time']
for d2 in d['Flux']:
for k, v in d2.items():
dict[k]=v
list.append(dict)
index.append(idx)
df=pd.DataFrame(list,index )
尝试:
df = pd.DataFrame(
[{k: v for d2 in d["Flux"] for k, v in d2.items()} for d in data],
index=[d["Time"] for d in data],
)
print(df)
打印:
V0 V1 V2 V3 V4 V5
18057610.0 -1.420900e-15 2.735300e-16 1.193500e-15 1.1624 -6.169200e-15 3.221800e-15
18057620.4 2.437700e-16 -6.280900e-15 1.645600e-15 1.1651 1.714700e-15 9.887200e-16
18057631.1 4.112400e-15 1.559800e-15 -2.325000e-16 1.1638 -3.998300e-15 4.459000e-16
您可以在列表理解中使用 built-in collections.ChainMap
方法:
from collections import ChainMap
out = pd.DataFrame([d | ChainMap(*d.pop('Flux')) for d in data])
输出:
Time V0 V1 V2 V3 V4 V5
0 18057610.0 -1.420900e-15 2.735300e-16 1.193500e-15 1.1624 -6.169200e-15 3.221800e-15
1 18057620.4 2.437700e-16 -6.280900e-15 1.645600e-15 1.1651 1.714700e-15 9.887200e-16
2 18057631.1 4.112400e-15 1.559800e-15 -2.325000e-16 1.1638 -3.998300e-15 4.459000e-16
一个选项是 pd.json_normalize
后跟一个 groupby(它不会像之前在 Python 内完成争论的选项那样有效):
( pd
.json_normalize(data, 'Flux', ['Time'])
.groupby('Time', as_index = False)
.min()
)
Time V0 V1 V2 V3 V4 V5
0 18057610.0 -1.420900e-15 2.735300e-16 1.193500e-15 1.1624 -6.169200e-15 3.221800e-15
1 18057620.4 2.437700e-16 -6.280900e-15 1.645600e-15 1.1651 1.714700e-15 9.887200e-16
2 18057631.1 4.112400e-15 1.559800e-15 -2.325000e-16 1.1638 -3.998300e-15 4.459000e-1
我有以下包含字典列表的数据
data= [
{'Time': 18057610.0,
'Flux': [{'V0': -1.4209e-15},
{'V1': 2.7353e-16},
{'V2': 1.1935e-15},
{'V3': 1.1624},
{'V4': -6.1692e-15},
{'V5': 3.2218e-15}]},
{'Time': 18057620.4,
'Flux': [{'V0': 2.4377e-16},
{'V1': -6.2809e-15},
{'V2': 1.6456e-15},
{'V3': 1.1651},
{'V4': 1.7147e-15},
{'V5': 9.8872e-16}]},
{'Time': 18057631.1,
'Flux': [{'V0': 4.1124e-15},
{'V1': 1.5598e-15},
{'V2': -2.325e-16},
{'V3': 1.1638},
{'V4': -3.9983e-15},
{'V5': 4.459e-16}]}]
我想得到这样的东西:
preferred_df
:
V0 V1 ... V4 V5
Time ...
18057610.0 -1.420900e-15 2.735300e-16 ... -6.169200e-15 3.221800e-15
18057620.4 2.437700e-16 -6.280900e-15 ... 1.714700e-15 9.887200e-16
18057631.1 4.112400e-15 1.559800e-15 ... -3.998300e-15 4.459000e-16
我想出了以下代码来达到目的:
df = pd.DataFrame(data).explode('Flux').reset_index(drop=True)
df = df.join(pd.DataFrame(df.pop('Flux').values.tolist())).groupby('Time').sum()
但是,我不想使用 groupby
和 sum()
。在展平字典并获得 preferred_df
时,还有哪些其他方法(字典理解?)可以在不获取 NaN 值的情况下展平 "Flux"
列?我尝试了 json_normalize()
但得到了相同的 NaN 并且需要使用 groupby()
和 sum()
.
基于接受的回答:
这是 Andrej Kesely 在列表理解中的字典理解的已接受答案的扩展 for loop
版本:
list=[]
index=[]
for d in data:
dict={}
idx=d['Time']
for d2 in d['Flux']:
for k, v in d2.items():
dict[k]=v
list.append(dict)
index.append(idx)
df=pd.DataFrame(list,index )
尝试:
df = pd.DataFrame(
[{k: v for d2 in d["Flux"] for k, v in d2.items()} for d in data],
index=[d["Time"] for d in data],
)
print(df)
打印:
V0 V1 V2 V3 V4 V5
18057610.0 -1.420900e-15 2.735300e-16 1.193500e-15 1.1624 -6.169200e-15 3.221800e-15
18057620.4 2.437700e-16 -6.280900e-15 1.645600e-15 1.1651 1.714700e-15 9.887200e-16
18057631.1 4.112400e-15 1.559800e-15 -2.325000e-16 1.1638 -3.998300e-15 4.459000e-16
您可以在列表理解中使用 built-in collections.ChainMap
方法:
from collections import ChainMap
out = pd.DataFrame([d | ChainMap(*d.pop('Flux')) for d in data])
输出:
Time V0 V1 V2 V3 V4 V5
0 18057610.0 -1.420900e-15 2.735300e-16 1.193500e-15 1.1624 -6.169200e-15 3.221800e-15
1 18057620.4 2.437700e-16 -6.280900e-15 1.645600e-15 1.1651 1.714700e-15 9.887200e-16
2 18057631.1 4.112400e-15 1.559800e-15 -2.325000e-16 1.1638 -3.998300e-15 4.459000e-16
一个选项是 pd.json_normalize
后跟一个 groupby(它不会像之前在 Python 内完成争论的选项那样有效):
( pd
.json_normalize(data, 'Flux', ['Time'])
.groupby('Time', as_index = False)
.min()
)
Time V0 V1 V2 V3 V4 V5
0 18057610.0 -1.420900e-15 2.735300e-16 1.193500e-15 1.1624 -6.169200e-15 3.221800e-15
1 18057620.4 2.437700e-16 -6.280900e-15 1.645600e-15 1.1651 1.714700e-15 9.887200e-16
2 18057631.1 4.112400e-15 1.559800e-15 -2.325000e-16 1.1638 -3.998300e-15 4.459000e-1