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

Posted

技术标签:

【中文标题】如何迭代数据列的每个单元格,转换和附加每个单元格?【英文标题】:How to iterate each cell of data column,convert and append each cell? 【发布时间】:2018-04-23 07:01:51 【问题描述】:

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

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

【问题讨论】:

抱歉,您能在问题中在这里发布几行数据吗?如果没有那么多,要可视化您的问题或制定解决方案并不容易。 df['data']中是否有可能只有501个索引值,直到索引1500 @cᴏʟᴅsᴘᴇᴇᴅ 我已经更新了我的示例输入以及我希望我的输出如何。谢谢。 谢谢,推翻了投票。 @andrew_reece 是的,可能是这样。那么有什么办法可以解决这个问题呢?请问有什么建议吗?谢谢。 【参考方案1】:

使用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

【讨论】:

@AshishPowani 如果有帮助,您可以接受答案 - 勾选答案旁边的灰色复选标记。谢谢。 我的声望低于 15。因此,虽然我的点赞被记录下来,但它不会改变公开显示的分数。【参考方案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

【讨论】:

此解决方案有效。谢谢你。 @cᴏʟᴅsᴘᴇᴇᴅ 给出的解决方案耗时 133.18 秒,耗时 117.90 秒。 有趣,pd.DataFrame(np.concatenate(df.col.values).tolist()) 呢?我认为它应该更快。 我在windows 7下的python 3中测试,pandas版本是0.20.3

以上是关于如何迭代数据列的每个单元格,转换和附加每个单元格?的主要内容,如果未能解决你的问题,请参考以下文章

给定一个包含多个列的手动表格,每个列都使用不同的渲染器,如何在数据更新时更改单个单元格的背景颜色?

CSS表格中第一行和第一列的每个单元格的不同背景颜色

读取 df,拆分每个单元格并附加到列表

试图在列的每个单元格中查找重复的逗号分隔文本

vbscript Word宏迭代表中的每个单元格并将数据提取到文本文件。

Kendo for jQuery:在网格列的每个单元格中显示两个不同控件之一