這是最好的避免創建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