Python 如何迭代数据列的每个单元格,转换和追加每个单元格?

Python 如何迭代数据列的每个单元格,转换和追加每个单元格?,python,pandas,loops,dictionary,Python,Pandas,Loops,Dictionary,数据框列的每一行都是字典列表 我想将字典列表转换为一个新的数据框,每个字典作为数据框中的一个新单元。字典的键作为列。每本字典有44个键,所以我有44列。 我需要对数据帧列的所有行(列表)执行此操作,并将每个新转换的数据帧单元附加到现有数据帧 我的问题是,并非列表中的所有词典都转换为新数据帧中的单元格。许多字典都丢了 My data frame column df[‘data’] looks like this: 0 [ { "name": "Tom", "age": 10 }, {

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

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

使用
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
是您的
pd.series
使用:

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
另一个改进的解决方案:

计时

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

对不起,你能在问题中发布几行你的数据吗?在没有那么多的数据的情况下,想象你的问题或制定解决方案并不容易。在
df['data']
中,索引
1500
,可能只有501个索引值吗?@cᴏʟᴅsᴘᴇᴇᴅ 我已经更新了我的示例输入和我希望我的输出如何。谢谢。谢谢,投票结果被推翻了。@andrew_reece是的,可能是这样。那么解决这个问题的办法是什么呢?有什么建议吗?谢谢。这个解决方案奏效了。非常感谢。当@c给出的解决方案时,耗时133.18秒ᴏʟᴅsᴘᴇᴇᴅ 花了117.90秒。有趣的是,
pd.DataFrame(np.concatenate(df.col.values).tolist())
?我认为它应该更快。我在Windows7下的Python3中测试了它,pandas版本是0.20。3@AshishPowani如果答案有帮助,你可以接受——在答案旁边的灰色勾选。谢谢。我的名声还不到15岁。因此,尽管我的投票记录在案,但它不会改变公开显示的分数。
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