我的目标
我正在努力根据分类变量S11AQ1A20的内容创建数据帧的子集。在我遇到的所有howtos中,分类变量包含字符串数据,但在我的情况下,它具有特定含义的整数值(YES = 1,NO = 0,9 =未知)。因此,我添加了类别让pandas正确标记值。
理想情况下,下面的示例代码中的案例A和B在子集化完成后将包含5行。但是目前,它只有在我没有标记整数值时才有效。
到目前为止我已经弄清楚了
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