数据框列的每一行都是字典列表。
我想将字典列表转换为新数据框,每个字典作为数据框中的新单元格。字典的键作为列。每个字典有44个键,所以我有44列。 我需要对数据帧列的所有行(列表)执行此操作,并将每个新转换的数据帧单元附加到现有数据帧。
我的问题是,并非我列表中的所有字典都转换为新数据框中的单元格。许多词典都被遗漏了。
My data frame column df[‘data’] looks like this:
0 [
{ "name": "Tom", "age": 10 },
{ "name": "Mark", "age": 5 },
{ "name": "Pam", "age": 7 },
{ "name": "Dick", "age": 12 }
]
1 [
{ "name": “Ash", "age": 20 },
{ "name": “Jim", "age": 54 },
{ "name": “Sam", "age": 29 },
{ "name": “Poo", "age": 15 }
]
len(df) = 2
输出应该是这样的:df_all
Name Age
Tom 10
Mark 5
Pam 7
Dick 12
Ash 20
Jim 54
Sam 29
Poo 15
len(df_all) =8
我的代码如下:
#Reading all the rows of the column ‘data’ from the df
data = df['data'].iloc[:1500]
len(data) #1500
#Creating an empty data frame
df_append = pd.DataFrame([])
#Iterating over all rows(lists of dictionaries) of a data frame and converting
#each list to a data frame and keep appending to it.
for each_item in data:
df_each_row = pd.DataFrame(each_item)
df_all = df_append.append(df_each_row)
df_all
len(df_all) #501
如果'数据'中的每一行(列表)有10个字典,那么最终数据帧中应该有1500 * 10(15000)行。相反,我只获得501行。但是,我正确地得到44列。
答案 0 :(得分:2)
使用np.concatenate
+ pd.DataFrame
构造函数。
df
col
0 [{'age': 10, 'name': 'Tom'}, {'age': 5, 'name'...
1 [{'age': 20, 'name': 'Ash'}, {'age': 54, 'name'...
pd.DataFrame(np.concatenate(df.col).tolist())
age name
0 10 Tom
1 5 Mark
2 7 Pam
3 12 Dick
4 20 Ash
5 54 Jim
6 29 Sam
7 15 Poo
如果你拥有的是一系列(不是数据框),那么np.concat(s)
就是s
pd.Series
。{/ p>
答案 1 :(得分:2)
使用:
from itertools import chain
df = pd.DataFrame(list(chain.from_iterable(df['col'].values.tolist())))
print (df)
age name
0 10 Tom
1 5 Mark
2 7 Pam
3 12 Dick
4 20 Ash
5 54 Jim
6 29 Sam
7 15 Poo
另一个解决方案,改进了cᴏʟᴅsᴘᴇᴇᴅ's solution:
df = pd.DataFrame(np.concatenate(df.col.values).tolist())
<强>计时强>:
df = pd.concat([df]*10000).reset_index(drop=True)
In [29]: %timeit (pd.DataFrame(np.concatenate(df['col']).tolist()))
1 loop, best of 3: 330 ms per loop
In [30]: %timeit (pd.DataFrame(list(chain.from_iterable(df['col'].values.tolist()))))
10 loops, best of 3: 81.4 ms per loop