繁体   English   中英

如何加快访问pandas dataframe列中的dicts列表?

[英]How to speed up accessing a list of dicts inside a pandas dataframe column?

这可能听起来像是一种疯狂的数据存储方式,但我正在处理稀疏的数据,为了节省空间,我创建了数据帧,其中一列是可变长度的dicts列表(从1到十几个dicts)每个都有三个元素)。 我正在尝试访问每个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循环,但是我只是无法看到它。

试试吧

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

首先使用函数(如果需要,可以很容易地成为lambda)和dataframe.apply()方法。

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

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

如果有任何内容,则应该具有较低的内存占用,因为该功能是在数据帧/系列中广播的,并且不会创建大的中间列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM