python - 如何更正python中通过str.contains生成的输出

标签 python pandas

我在 CSV 文件中只有一列“methods_discussed”(链接为 https://github.com/pandas-dev/pandas/files/3496001/multiple_responses.zip ),其中包含家庭规划方法的值名称,例如:

methods_discussed

emergency
female_sterilization
male_sterilization
iud
NaN
injectables male_condoms
male_condoms
female_sterilization male_sterilization
injectables
iud male_condoms

我用过df1["methods_discussed"].str.contains(pat = method)但输出与预期不匹配。可能male_sterilization是female_sterilization的子字符串,并且male_sterilization显示TRUE。如下所示,索引 2 处的实际输出。它必须显示 FALSE,因为 Female_sterilization 位于索引 2 处的 method_discussed 列中。

创建了 8 种计划生育方法的列表

method_names = ['female_condoms', 'emergency', 'male_condoms', 'pill', 'injectables', 'iud', 'male_sterilization', 'female_sterilization']

for method in method_names:
    df1[method]=df1["methods_discussed"].str.contains(pat = method)
df1.head(2)

预期输出

id | methods_discussed | female_condoms | emergency | male_condoms | pill | injectables | iud | male_sterilization | female_sterilization
1 | emergency | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE
2 | female_sterilization | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | ***FALSE*** | TRUE

实际输出

id | methods_discussed | female_condoms | emergency | male_condoms | pill | injectables | iud | male_sterilization | female_sterilization
1 | emergency | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE
2 | female_sterilization | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | ***TRUE*** | TRUE

代码中没有错误,但仅在输出中出现错误

最佳答案

在模式周围使用单词边界 - \b\b 来避免它,参数 na=False 也可以很好地避免 NaN输出 - 此处替换为 False:

for method in method_names:
    df1[method]=df1["methods_discussed"].str.contains(pat = r"\b{}\b".format(method), na=False)
<小时/>
print (df1)
                         methods_discussed  female_condoms  emergency  \
0                                emergency           False       True   
1                     female_sterilization           False      False   
2                       male_sterilization           False      False   
3                                      iud           False      False   
4                                      NaN           False      False   
5                 injectables male_condoms           False      False   
6                             male_condoms           False      False   
7  female_sterilization male_sterilization           False      False   
8                              injectables           False      False   
9                         iud male_condoms           False      False   

   male_condoms   pill  injectables    iud  male_sterilization  \
0         False  False        False  False               False   
1         False  False        False  False               False   
2         False  False        False  False                True   
3         False  False        False   True               False   
4         False  False        False  False               False   
5          True  False         True  False               False   
6          True  False        False  False               False   
7         False  False        False  False                True   
8         False  False         True  False               False   
9          True  False        False   True               False   

   female_sterilization  
0                 False  
1                  True  
2                 False  
3                 False  
4                 False  
5                 False  
6                 False  
7                  True  
8                 False  
9                 False  

关于python - 如何更正python中通过str.contains生成的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57476760/

相关文章:

python - 如何处理负值的 pct_change

python - datetime 类型的对象不是 JSON 可序列化错误

python - 使用 pandas dataframe 加速迭代过程

python矩阵乘法: how to handle very large matrices?

python - PostgreSQL 和 Python

python - 如何将不同长度的时间窗应用于 Pandas 数据框

python - 计算数据帧中每一行有多少个连续的 TRUE

python - 计算 DataFrame 中各组的差异和均值

python - 在 Python 中修改 Numpy 数组(元组定义)部分的更快/更好的方法?

python - 将数据帧拆分为子数据帧并与一行重新组合以表示数据帧