【问题标题】:How to speed up accessing a list of dicts inside a pandas dataframe column?如何加快访问熊猫数据框列中的字典列表?
【发布时间】:2023-04-08 10:58:01
【问题描述】:

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

假设我有一个包含猫、狗和仓鼠属性的数据框,我有 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 循环,但我就是看不到它。

【问题讨论】:

  • df.apply 将在您的数据帧中广播一个函数(按行或按列)

标签: python python-3.x pandas lambda


【解决方案1】:

试试

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

【讨论】:

  • 甜蜜!我不知道你可以像这样使用菊花链列表理解,而且我不知道它也适用于 dicts。相比之下快得惊人。
【解决方案2】:

首先使用函数(如果您愿意,可以很容易地使用 lambda)和 dataframe.apply() 方法。

def extract_colors(x): 
    return list(map(lambda a: a["color"], x)) 

df["colors"] = df.attributes.apply(extract_colors)

如果有的话,这应该具有较低的内存占用,因为该函数在数据帧/系列中广播,并且不会创建大型中间列表。

【讨论】:

    猜你喜欢
    • 2020-07-22
    • 2015-06-02
    • 2021-08-19
    • 2020-09-23
    • 2019-08-24
    • 2019-05-07
    • 2016-04-21
    相关资源
    最近更新 更多