【问题标题】:Comparison of strings not working in pandas dataframe?比较在熊猫数据框中不起作用的字符串?
【发布时间】:2019-11-25 09:32:30
【问题描述】:

我正在根据字符串比较为我的 df(导入的 CSV 文件)制作掩码,但似乎 .contains 有效,但 == 无效。

这个掩码使用.contains:

mask = (y_train['SEPSISPATOS'].str.contains('Yes')) | (y_train['SEPSHOCKPATOS'].str.contains('Yes')) | (y_train['OTHSYSEP'].str.contains('Sepsis')) | (y_train['OTHSESHOCK'].str.contains('Septic Shock'))

返回这个输出(注意最后一行):

SEPSISPATOS   SEPSHOCKPATOS   OTHSYSEP   OTHSESHOCK           SEPSISPATOS
b'No'         b'No'  b'No Complication'  b'No Complication'   0
b'No'         b'No'  b'No Complication'  b'No Complication'   0
b'No'         b'No'  b'No Complication'  b'No Complication'   0
b'No'         b'No'  b'No Complication'  b'Septic Shock'      1            

而这另一个掩码使用直接比较

mask = (y_train['SEPSISPATOS']=='Yes') | (y_train['SEPSHOCKPATOS']=='Yes') | (y_train['OTHSYSEP']=='Sepsis') | (y_train['OTHSESHOCK']=='Septic Shock')

返回:

SEPSISPATOS   SEPSHOCKPATOS   OTHSYSEP   OTHSESHOCK           SEPSISPATOS
b'No'         b'No'  b'No Complication'  b'No Complication'   0
b'No'         b'No'  b'No Complication'  b'No Complication'   0
b'No'         b'No'  b'No Complication'  b'No Complication'   0
b'No'         b'No'  b'No Complication'  b'Septic Shock'      0            

想知道我是否有字符串字节而不是 Python 3 Unicode 字符串,我尝试过解码(如下)。我也试过.str.strip()。两者都不起作用。我需要一个修复程序,让我可以对包含文本的任何列使用字符串之间的直接比较。

重新编辑:utf-8 解码

NSQIPdf_train = pd.read_csv("acs_nsqip_puf13_2.csv")
str_df=df.select_dtypes([np.object])
str_df=str_df.stack().str.decode('utf-8').unstack()
for col in str_df:
    NSQIPdf_train[col] = str_df[col]
y_train = NSQIPdf_train.loc[:,('SEPSISPATOS','SEPSHOCKPATOS', 'OTHSYSEP', 'OTHSESHOCK')]

这进一步加剧了我的问题......因为输出变为:

SEPSISPATOS   SEPSHOCKPATOS   OTHSYSEP   OTHSESHOCK        SEPSISPATOS
NaN            NaN            NaN        NaN               0
NaN            NaN            NaN        NaN               0
NaN            NaN            NaN        NaN               0
NaN            NaN            NaN        NaN               0          

【问题讨论】:

  • y_train['SEPSHOCKPATOS'].str.==('Yes') 不是有效的 Python 语法
  • 另外,'Yes' 周围的括号会分散注意力
  • 最后,.str 是一个访问器,所以y_train['SEPSHOCKPATOS'].str == 'Yes' 并没有按照你的想法做(尝试打印y_train['SEPSHOCKPATOS'].str
  • 谢谢,我已经做出了这些更改并更新了原始帖子中的代码(第三块)以反映它,但 y_train['SEPSISPATOS']=='Yes' 似乎不起作用任何一个。与以前相同的输出。
  • .str.decode('utf-9') 应该是 utf-8

标签: string pandas dataframe encoding byte


【解决方案1】:

在进行比较之前使用.str.decode('utf-8') 将字节值转换为字符串(参见question):

y_train['SEPSHOCKPATOS'].str.decode('utf-8') == 'Yes'

注意:我猜.str.contains 在后台进行了转换。

【讨论】:

  • 我尝试了两个 y_train['SEPSHOCKPATOS'].str.decode('utf-8') == 'Yes',结果和以前一样。根据您建议中的链接,我还尝试预先解码整个 df ,这实际上导致了更多问题。打印出 y_train['SEPSHOCKPATOS'].str.decode('utf-8') 给我 NaN。
【解决方案2】:

我是 Pandas 的新手,但也许 str.fullmatch 有帮助 - 一个更严格的 str.contains 版本,匹配整个字符串,因此,

y_train['SEPSHOCKPATOS'].str.fullmatch('Yes')

虽然请注意这实际上是在检查正则表达式,因此请注意您使用的字符串是否包含任何特殊字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 2017-02-28
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    相关资源
    最近更新 更多