我有一个熊猫数据框,其中包含一系列字典,如下所示:
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)
这感觉很脏而且效率低下。有没有更优雅的方法来实现这一目标?
答案 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()
我想正确的做法是。