这是最好的避免创建DataFrame,其列的值为 字典列表。但为了帮助您做到这一点,我们需要了解用于构建当前DataFrame的 数据的来源。
鉴于目前的数据帧,但是,您可以通过使用df['misc'].apply(func)
调用一个函数,func
,在df['misc']
每个 值将其转换为所需的数据框 。
如果您安排此功能返回一个系列,则 df['misc'].apply(func)
将返回一个DataFrame,其列对应于该系列的索引。例如,
def func(x):
try:
df = pd.DataFrame(ast.literal_eval(x))
result = pd.Series(df['value'].values, index=df['type'])
except KeyError:
result = pd.Series()
return result
attributes = df['misc'].apply(func)
print(attributes)
产生
cars pets shoes siblings
0 3 1 13 NaN
1 NaN 1 NaN 3
2 NaN NaN NaN NaN
现在,我们可以用0取代的NaN:
attributes = attributes.fillna(0)
从df
除去misc
柱:
del df['misc']
和通过连接建立所需的数据帧df
与attributes
:
df = pd.concat([df, attributes], axis=1)
全部放在一起,
import numpy as np
import pandas as pd
import ast
df = pd.DataFrame(
[('Jim', 44, '''[{"value":3,"type":"cars"},{"value":1,"type":"pets"}, {"value":13,"type":"shoes"}]'''),
('Bob', 25, '[{"value":3,"type":"siblings"},{"value":1,"type":"pets"}]'),
('Sue', 55, '[]')],
columns=['name', 'age', 'misc'])
def func(x):
try:
df = pd.DataFrame(ast.literal_eval(x))
result = pd.Series(df['value'].values, index=df['type'])
except KeyError:
result = pd.Series()
return result
attributes = df['misc'].apply(func)
attributes = attributes.fillna(0)
del df['misc']
df = pd.concat([df, attributes], axis=1)
print(df)
产量
name age cars pets shoes siblings
0 Jim 44 3 1 13 0
1 Bob 25 0 1 0 3
2 Sue 55 0 0 0 0
这似乎很有希望,问题是我现在发现每个实际上都是字符串,所以它实际上是这样的:''[[“value”:3,“type”:“cars”},{“value” :1,“type”:“pets”},{“value”:13,“type”:“shoes”}]“' – user4843645
您可以使用literal_eval将其转换回列表:from ast import literal_eval df ['misc '] = [在df.misc中为r的literal_eval(r)] – Alexander