簡體   English   中英

Str 包含來自列表並通過列表項區分

[英]Str contains from list and distinguish by items of list

我有一個數據框df ,有兩列:腳本(帶文本)和揚聲器

Script  Speaker
aze     Speaker 1 
art     Speaker 2
ghb     Speaker 3
jka     Speaker 1
tyc     Speaker 1
avv     Speaker 2 
bhj     Speaker 1

我有以下列表: list = ['a','b','c']

我的目標是獲得這樣的矩陣/數據框,只有我列表中的項目。

Speaker     a    b    c
Speaker 1   2    1    1
Speaker 2   2    0    0
Speaker 3   0    1    0

我嘗試了以下方法:

r = '|'.join(list)

nb_df = df[df['Script'].str.contains(r, case = False)]
df_target = nb_df.groupby('Speaker')['Speaker'].count()

我獲得了目標的一部分,我知道每個發言者說從列表中搜索的項目的時間。 但我無法區分每個項目的時間數。

  1. 如何使用 Pandas 函數(如果存在)
  2. 我怎么能用 Python 循環呢?

首先不要像變量一樣使用list ,因為內置(python 代碼字)。

crosstabSeries.str.extractall一起Series.str.extractall

print (df)
  Script    Speaker
0    azc  Speaker 1 <-change sample data
1    art  Speaker 2
2    ghb  Speaker 3
3    jka  Speaker 1
4    tyc  Speaker 1
5    avv  Speaker 2
6    bhj  Speaker 1

L = ['a','b','c']
pat = r'({})'.format('|'.join(L))
df = df.set_index('Speaker')['Script'].str.extractall(pat)[0].reset_index(name='val')

df = pd.crosstab(df['Speaker'], df['val'])
print (df)
val        a  b  c
Speaker           
Speaker 1  2  1  2
Speaker 2  2  0  0
Speaker 3  0  1  0

如果性能不是那么重要,請使用 3 個文本函數Series.str.findallSeries.str.joinSeries.str.get_dummies並按級別sum

df = (df.set_index('Speaker')['Script'].str.findall('|'.join(L))
        .str.join('|')
        .str.get_dummies()
        .sum(level=0))
print (df)
           a  b  c
Speaker           
Speaker 1  2  1  2
Speaker 2  2  0  0
Speaker 3  0  1  0

您可以將series.str.findall()str.join()str.get_dummies()groupby().sum

l = ['a','b','c']
final=(df['Script'].str.findall('|'.join(l)).str.join('|')
  .str.get_dummies().groupby(df['Speaker']).sum())

           a  b  c
Speaker           
Speaker 1  2  1  1
Speaker 2  2  0  0
Speaker 3  0  1  0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM