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