如何迭代数据列的每个单元格,转换并附加每个单元格?

时间:2017-11-10 05:25:28

标签: python pandas loops dictionary

数据框列的每一行都是字典列表。

我想将字典列表转换为新数据框,每个字典作为数据框中的新单元格。字典的键作为列。每个字典有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列。

2 个答案:

答案 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