python - 如何加快访问 pandas 数据框列中的字典列表?

标签 python python-3.x pandas lambda

这听起来像是一种疯狂的数据存储方式,但我正在处理稀疏数据,为了节省空间,我创建了数据框,其中一列是可变长度的字典列表(从 1 到一打字典,每个字典包含三个元素)。我正在尝试访问每个字典中的第二个元素,并创建一个仅包含这些第二个元素列表的新列。我实际上无法粘贴我的数据,但是我可以提供一个非常接近它的示例。

想象一下,我有一个包含我的猫、狗和仓鼠属性的数据框,我有 3 只猫、1 只狗和 1 只仓鼠,每只都有颜色和皮毛长度数据。我基本上是在尝试访问每种动物类型的特定属性列表。现在下面的代码工作得很好。但是,如果将它扩展到超过 22,000 行,它会非常慢。这可能是由于 for 循环。

df = pd.DataFrame({'name':['cats','dogs','hamsters'],'attributes':[[{'color':'white','fur':'short'},{'color':'black','fur':'long'},{'color':'gray','fur':'long'}],[{'color':'brown','fur':'short'}],[{'color':'brown','fur':'short'}]]})


df['colors']=''
for i in range(len(df)):
  attributes = df.attributes.iloc[i]
  df.loc[i,['colors']] = [list(map(lambda x: x['color'],attributes))]

df 之前:

       name                                         attributes
0      cats  [{'color': 'white', 'fur': 'short'}, {'color':...
1      dogs               [{'color': 'brown', 'fur': 'short'}]
2  hamsters               [{'color': 'brown', 'fur': 'short'}]

df 之后:

       name  ...                colors
0      cats  ...  [white, black, gray]
1      dogs  ...               [brown]
2  hamsters  ...               [brown]

我正在寻找一种方法来加速这个过程,可能是使用 lambda 函数?不确定,但几乎总有一种方法可以放弃 for 循环,但我就是看不到它。

最佳答案

试试

l=[[y['color'] for y in x] for x in df.attributes]
l
Out[321]: [['white', 'black', 'gray'], ['brown'], ['brown']]
df['color']=l

关于python - 如何加快访问 pandas 数据框列中的字典列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56385009/

相关文章:

python - 对于给定的 pandas 列,是否有一种更快的方法来检查数据条目的符号是否与前一行中数据条目的符号不同?

python-3.x - 使用 --ignore 和 --junitxml 进行 pytest 测试生成带有忽略测试的 xml

Python:从标准输入读取gzip

Python pandas 几种DataFrame最佳实践

python - Pandas:去季节性时间序列数据

python - 使用 python urllib2 获取 https 请求

python - 在 Python 中加载 grib2 文件

python - 没有 SQLContext 的 pyspark 中的 clearCache

python - Python : How do I simplify this code? 优化

python - Pandas :根据条件合并行