[英]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()
我獲得了目標的一部分,我知道每個發言者說從列表中搜索的項目的時間。 但我無法區分每個項目的時間數。
首先不要像變量一樣使用list
,因為內置(python 代碼字)。
將crosstab
與Series.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.findall
、 Series.str.join
和Series.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.