簡體   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