[英]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.