如何根据分类变量的条件对pandas数据帧进行子集化

时间:2017-04-05 18:03:13

标签: python pandas dataframe conditional-statements subset

我的目标

我正在努力根据分类变量S11AQ1A20的内容创建数据帧的子集。在我遇到的所有howtos中,分类变量包含字符串数据,但在我的情况下,它具有特定含义的整数值(YES = 1,NO = 0,9 =未知)。因此,我添加了类别让pandas正确标记值。

理想情况下,下面的示例代码中的案例A和B在子集化完成后将包含5行。但是目前,它只有在我没有标记整数值时才有效。

到目前为止我已经弄清楚了

  • 案例B显示,只要添加了以下行的类别,子集就会按照指示执行:

df.S11AQ1A20 = df.S11AQ1A20.cat.rename_categories(['Yes', 'No', 'Unknown'])

示例数据集

可以在此处找到用于测试的样本数据集(nesarc_short.csv):https://pastebin.com/NkTeBsDR

示例代码:

dataset_path = 'nesarc_short.csv'
df = pd.read_csv(dataset_path, low_memory=False, na_values=' ')

print('CASE A: NUMERICAL -> working\n')

df = pd.read_csv(dataset_path, low_memory=False, na_values=' ')

print("A: Rows before: " + str(len(df.S11AQ1A20))) # Outputs: 100

df = df[(df.S11AQ1A20 == 1)]

print("A: Rows after: " + str(len(df.S11AQ1A20))) # Outputs: 5


###############################################################


print('\nCASE B: CATEGORICAL -> Not working\n')

df = pd.read_csv(dataset_path, low_memory=False, dtype={ 'S11AQ1A20' : 'category' }, na_values=' ')

# If this is commented out, the subsetting works but no labels will be available
df.S11AQ1A20 = df.S11AQ1A20.cat.rename_categories(['Yes', 'No', 'Unknown'])

print("B: Rows before: " + str(len(df.S11AQ1A20))) # Outputs: 100

df = df[(df.S11AQ1A20 == 'YES') | (df.S11AQ1A20 == '1') | (df.S11AQ1A20 == 1)]

print("B: Rows after: " + str(len(df.S11AQ1A20))) # Outputs: 0

控制台输出

  

案例A:数字 - >工作

     

答:之前的行:100

     

答:之后的行:5

           

案例B:类别 - >不工作

     

B:之前的行数:100

     

B:行之后:0

0 个答案:

没有答案