在数据框中解包字典

时间:2018-09-03 15:48:36

标签: python pandas numpy dictionary dataframe

我有一个熊猫数据框,其中包含一系列字典,如下所示:

df.head()

Index                 params                    score            
0   {'n_neighbors': 1, 'weights': 'uniform'}    0.550
1   {'n_neighbors': 1, 'weights': 'distance'}   0.550
2   {'n_neighbors': 2, 'weights': 'uniform'}    0.575
3   {'n_neighbors': 2, 'weights': 'distance'}   0.550
4   {'n_neighbors': 3, 'weights': 'uniform'}    0.575

目标是为每个实例创建一个以“ n_neighbors”和“ weights”作为属性的数据框,并删除params列。我通过创建空的numpy数组,循环和附加实现了这一点:

n_neighbors = np.array([])
weights = np.array([])

count = sum(df["score"].value_counts())

for x in range(count):
     n_neighbors = np.append(n_neighbors, df["params"][x]["n_neighbors"])

for x in range(count):
     weights = np.append(weights, df["params"][x]["weights"])

df["n_neighbors"] = n_neighbors
df["weights"] = weights
df = df.drop(["params"], axis=1)

这感觉很脏而且效率低下。有没有更优雅的方法来实现这一目标?

3 个答案:

答案 0 :(得分:1)

df['params']构造一个新的数据框,并将其加入到原始数据框。为方便起见,pd.DataFrame.pop同时返回一个序列并将其从数据框中删除。

df = pd.DataFrame({'Index': [0, 1],
                   'params': [{'n_neighbors': 1, 'weights': 'uniform'},
                              {'n_neighbors': 1, 'weights': 'distance'}],
                   'score': [0.550, 0.550]})

res = df.join(pd.DataFrame(df.pop('params').tolist()))

print(res)

   Index  score  n_neighbors   weights
0      0   0.55            1   uniform
1      1   0.55            1  distance

答案 1 :(得分:0)

简单

datapoints = list(dataframe['params'])
data = pd.DataFrame(datapoints)
data['score'] = list(dataframe['score'])

答案 2 :(得分:-1)

在您的情况下,您不需要numpy。普通的python列表感觉更好。我提醒您,df实际上是字典列表(每一行都是字典,列表中相似。请检查Doku ex:d = {'col1':[1,2],'col2':[3,4 ]},因此遵循模式。 将其传递给构造函数pd.DataFrame()

我想正确的做法是。