我在 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/