繁体   English   中英

将列表转换为熊猫数据框中的集合

[英]Conversion of list to sets in pandas dataframe

我想在数据框列的每一行中搜索子字符串。 我在某处读到,搜索该列是否可以转换为一组更快。 我正在尝试使用此处建议的方法: 如何将列表转换成熊猫集? 但是我得到了一些意外的输出。 我的数据框如下所示:

      R_id        Badges
0    7LBCS        New Reviewer - 1 Review
1    8FKME        New Reviewer - 1 Review; New Photographer - 1 Photo; Reviewer - 3 Reviews;

当我使用以下方法时:

df['Badges'] = df.apply(lambda row: set(row['Badges']), axis=1)

要么

df['Badges'] = df['Badges'].apply(set)

我为上面的数据框中的每一行获得的输出是一组具有该行中字符串的唯一字符的集合。 我无法复制确切的输出,因为由于某种原因,一旦生成输出,Spyder IDE就会崩溃。 但是第一行的输出如下所示:

{'1', '-', 'N', 'e', 'w', 'R', 'v', 'i', 'r'}

转换为集合时,这里可能出什么问题?

您必须先分割才能使用set:

In [11]: df.Badges.str.split('\s*;\s*').apply(set)
Out[11]:
0                            {New Reviewer - 1 Review}
1    {Reviewer - 3 Reviews, , New Photographer - 1 ...
Name: Badges, dtype: object

要丢弃空容器,我可以对其进行如下调整:

In [12]: df.Badges.str.split('\s*;\s*').apply(lambda bs: set(b for b in bs if b))
Out[12]:
0                            {New Reviewer - 1 Review}
1    {Reviewer - 3 Reviews, New Photographer - 1 Ph...
Name: Badges, dtype: object

或者您可以删除';' 首先(如果这是唯一的空白来源):

In [13]: df.Badges.str.strip(';').str.split('\s*;\s*').apply(set)
Out[13]:
0                            {New Reviewer - 1 Review}
1    {Reviewer - 3 Reviews, New Photographer - 1 Ph...
Name: Badges, dtype: object

后者可能会更有效率...

您的数据的格式不便于使用。 我建议对Andy代码进行扩展,以使每个条目都有自己的行,这样您就可以更加有效地过滤数据。

str.split开始,然后使用str.extract提取键值对。

df = df.set_index('R_id')\
       .Badges.str.split('\s*;\s*', expand=True)\
       .stack().reset_index(level=1, drop=1)\
       .str.extract('(?P<Name>[^-]+).*(?P<Val>\d+)', expand=True)\
       .dropna()

print(df)
                    Name Val
R_id                        
7LBCS      New Reviewer    1
8FKME      New Reviewer    1
8FKME  New Photographer    1
8FKME          Reviewer    3

一个小时的痛苦可能会增加一个世纪。

暂无
暂无

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

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