【问题标题】:Extract np.array from dict in each row of pd data frame从 pd 数据帧的每一行中的 dict 中提取 np.array
【发布时间】:2021-09-16 22:45:04
【问题描述】:

我设法将字典存储在 pd.dataframe 的一列的每一行中。 请问有没有一种没有for循环的方法可以一次从每个dicts中的特定键中提取np.arrays?

我的小例子:

import pandas as pd
import numpy as np

d={}
d['key1']=np.array([[1, 2, 3], [4, 5, 6]])
d['key2']=np.array([1,2,3,4])                     
d['key3']='Mexico'

df=pd.DataFrame( index=[0,1,2,3,4,5],columns=['A'])

df.loc[0,'A'] = [d]
df.loc[1,'A'] = [d]
df.loc[2,'A'] = [d]
df.loc[3,'A'] = [d]
df.loc[4,'A'] = [d]
df.loc[5,'A'] = [d]

df

df.loc[[1,2,3],'A']

使用df.loc[[1,2,3],'A'],我可以选择多行,因此可以选择多个字典,但例如,我无法访问它们中的每一个的“key2”。 有没有一种方法可以一次从所有选定行的“key2”中提取数据而无需循环,好吗?谢谢。

编辑: 在尝试放置字典而不包装到数据框的元素时避免ValueError: Incompatible indexer with Series,可以使用.at 来实现。 该示例将扩展为

df.at[0,'B'] = d
df.at[1,'B'] = d
df.at[2,'B'] = d
df.at[3,'B'] = d
df.at[4,'B'] = d
df.at[5,'B'] = d

df

【问题讨论】:

  • “被阻止访问'key2'”是什么意思。你做了什么?你得到哪个错误?为什么要将每个元素包装到一个列表中?
  • 感谢您的评论。 “被阻止访问'key2'” - 我的意思是我无法进行下一步。与此同时,我发现可能 apply 方法可以工作。重新包装:见下文。如果我不这样做,就会出错。
  • dict 必须单独访问。因此需要循环。

标签: python pandas dataframe numpy dictionary


【解决方案1】:

你可以使用:

df.loc[[1,2,3],'A'].apply(lambda x: x[0]["key2"])

1    [1, 2, 3, 4]
2    [1, 2, 3, 4]
3    [1, 2, 3, 4]

不过,一些代码建议:

  1. 不要使用dict 作为变量名,而是使用ddict 是 python 的内置函数。

  2. 您应该使用列表的字典,然后您可以将数据框中的每一列设置为字典中的键:

d={}
d['key1']=[np.array([[1, 2, 3], [4, 5, 6]])]
d['key2']=[np.array([1,2,3,4])]                     
d['key3']=['Mexico']

然后您可以创建如下数据框:

df = pd.DataFrame.from_dict(d)

列将是字典的键:

                     key1          key2    key3
0  [[1, 2, 3], [4, 5, 6]]  [1, 2, 3, 4]  Mexico

【讨论】:

  • 谢谢。我会尽力落实你的建议。我将dict 重命名为d。我使用df=pd.DataFrame(index=[0,1,2,3,4,5],columns=['A']) 创建了我的df,但是当我使用示例中的dict(现在称为d 并且每个项目不是列表)执行df.loc[0,'A'] = d 时,我得到ValueError: Incompatible indexer with Series。我想这就是我把字典放在一个列表中的原因。
  • 我还有一个问题,拜托。关于使用 lambda 函数的 apply 方法,这不是间接循环吗?但我现在学会了如何使用 apply 方法。 applymap 不起作用,因为它只期望单个标量作为结果,好吗?感谢您的耐心等待。
  • 对不起,你是对的。我已经删除了我答案的那部分。使用df.apply 与遍历数据帧的行不同。 apply 更快,因为 pandas 能够使用优化的 c 代码来执行操作。它并非总是最快的执行操作的方法,但很多时候它是最简单、最易读且足够快的方法。
  • 谢谢。第一个代码部分是最有帮助的。我了解x[0] 可以访问列表的第一个元素,即字典。通过密钥我获得了价值。现在我必须弄清楚为什么这对我的真实单词示例不起作用:-) 第二部分很高兴知道。目前,我只是不明白为什么我应该创建一个新的 df,当我有一个并且只想从一列的每一行中的每个字典中提取一个 np.array 时。我很抱歉,如果我没有看到这个。但是非常感谢您的帮助。
  • 我对其他 SO 的印象是 dataframe apply 非常慢,尤其是使用通用函数时。它可以通过选定的操作应用自己的编译方法,但它不会编译您的 Python 代码。有一个 raw 参数告诉它直接使用 numpy 数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
相关资源
最近更新 更多