gpt4 book ai didi

python - pandas - 基于子串出现次数的表达方法

转载 作者:太空宇宙 更新时间:2023-11-03 13:08:09 26 4
gpt4 key购买 nike

假设我有一个如下所示的 DataFrame:

df=pd.DataFrame({'name': ['john','jack','jill','al','zoe','jenn','ringo','paul','george','lisa'], 'how do you feel?': ['excited', 'not excited', 'excited and nervous', 'worried', 'really worried', 'excited', 'not that worried', 'not that excited', 'nervous', 'nervous']})

how do you feel? name
0 excited john
1 not excited jack
2 excited and nervous jill
3 worried al
4 really worried zoe
5 excited jenn
6 not that worried ringo
7 not that excited paul
8 nervous george
9 nervous lisa

我对计数感兴趣,但按三类分组:“兴奋”、“担心”和“紧张”。

要注意的是,“兴奋和紧张”应该与“兴奋”归为一类。事实上,包含“excited”的字符串应该被包含在一个组中,除了像“not that excited”和“not excited”这样的字符串。同样的逻辑适用于“担心”和“紧张”。 (请注意,“兴奋和紧张”实际上同时属于“兴奋”和“紧张”组)

您可以看到典型的 groupby 不起作用,字符串搜索必须灵活。

我有一个解决方案,但想知道你们是否都能找到更好的 Pythonic 方法,和/或使用我可能不知道的更合适的方法。

这是我的解决方案:

定义一个函数以返回包含所需子字符串且不包含否定情绪的子字符串的行的计数

def get_perc(df, column_label, str_include, str_exclude):

data=df[col_lab][(~df[col_lab].str.contains(str_exclude, case=False)) & \
(df[col_lab].str.contains(str_include, case=False))]

num=data.count()

return num

然后,在循环内调用此函数,传入各种“str.contains”参数,并将结果收集到另一个 DataFrame 中。

groups=['excited', 'worried', 'nervous']
column_label='How do you feel?'

data=pd.DataFrame([], columns=['group','num'])
for str_include in groups:
num=get_perc(df, column_label, str_include, 'not|neither')
tmp=pd.DataFrame([{'group': str_include,'num': num}])
data=pd.concat([data, tmp])


data

group num
0 excited 3
1 worried 2
2 nervous 3

有没有您能想到的更简洁的方法?我确实尝试在“str.contains”中使用正则表达式来尝试避免需要两个 bool 系列和“&”。但是,如果没有捕获组,我无法做到这一点,这意味着我必须使用“str.extract”,这似乎不允许我以相同的方式选择数据。

非常感谢任何帮助。

最佳答案

你可以这样做:

方法一

  1. 忽略 not 行,然后
  2. 从指标字符串中获取相关的

In [140]: col = 'how do you feel?'

In [141]: groups = ['excited', 'worried', 'nervous']

In [142]: df.loc[~df[col].str.contains('not '), col].str.get_dummies(sep=' ')[groups].sum()
Out[142]:
excited 3
worried 2
nervous 3
dtype: int64

方法二

In [162]: dfs = df['how do you feel?'].str.get_dummies(sep=' ')

In [163]: dfs.loc[~dfs['not'].astype(bool), groups].sum()
Out[163]:
excited 3
worried 2
nervous 3
dtype: int64

关于python - pandas - 基于子串出现次数的表达方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51408383/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com