比较字符串在熊猫数据框中不起作用?

时间:2019-07-16 15:29:56

标签: string pandas dataframe encoding byte

我正在基于字符串比较为我的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()。两者都不起作用。我需要一个修复程序,使我可以对包含文本的任何列使用字符串之间的直接比较。

编辑re: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          

2 个答案:

答案 0 :(得分:0)

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

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

注意:我想.str.contains会在幕后进行转换。

答案 1 :(得分:0)

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

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

尽管请注意,这实际上是在检查正则表达式,但是请注意所使用的字符串是否包含任何特殊字符。