如何迭代数据列的每个单元格,转换和附加每个单元格?
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以上是关于如何迭代数据列的每个单元格,转换和附加每个单元格?的主要内容,如果未能解决你的问题,请参考以下文章
给定一个包含多个列的手动表格,每个列都使用不同的渲染器,如何在数据更新时更改单个单元格的背景颜色?