Python 如何根据分类变量的条件对数据帧进行子集
我的目标 我正在努力根据分类变量S11AQ1A20的内容创建数据帧的子集。在我遇到的所有howto中,分类变量都包含字符串数据,但在我的例子中,它是具有特定含义的整数值(YES=1,NO=0,9=Unknown)。因此,我添加了类别,以便熊猫能够正确地标记这些值 理想情况下,下面示例代码中的情况A和B在完成子集设置后将包含5行。但目前,它只有在不标记整数值的情况下才起作用 到目前为止我已经知道了什么Python 如何根据分类变量的条件对数据帧进行子集,python,pandas,dataframe,conditional-statements,subset,Python,Pandas,Dataframe,Conditional Statements,Subset,我的目标 我正在努力根据分类变量S11AQ1A20的内容创建数据帧的子集。在我遇到的所有howto中,分类变量都包含字符串数据,但在我的例子中,它是具有特定含义的整数值(YES=1,NO=0,9=Unknown)。因此,我添加了类别,以便熊猫能够正确地标记这些值 理想情况下,下面示例代码中的情况A和B在完成子集设置后将包含5行。但目前,它只有在不标记整数值的情况下才起作用 到目前为止我已经知道了什么 案例B显示,在使用以下行添加类别时,子分类ins不会像EXPECTED那样执行: df.S1
- 案例B显示,在使用以下行添加类别时,子分类ins不会像EXPECTED那样执行:
df.S11AQ1A20=df.S11AQ1A20.cat.rename_类别(['Yes','No','Unknown'))
样本数据集
用于测试的样本数据集(nesarc_short.csv)可在以下位置找到:
示例代码:
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:数字->工作
A:前几行:100
A:后面的行:5
案例B:分类->不工作 B:100之前的行 B:0之后的行
如果您提交一份包含一些用于演示的数据的报告,以便能够复制您的问题,这将非常有用。还请注意,您的检查
df_helper.df['S12Q2A12']==1
与df_helper.df['S12Q2A12']=='YES'
非常不同,因为第一个是比较整数,而另一个是比较字符串。这实际上取决于要使用哪个筛选器的列中的数据。关于使用条件从数据帧中选择行,有很多问题。如果你看看其中的一些,并解释为什么它们不能解决你的问题,这会很有帮助。MWE也是至关重要的。现在投票关闭,当你更新问题时将收回。好的,我将更新帖子,并尝试使问题更具可复制性python中的字符串比较区分大小写('Yes'!='Yes'
),因此请尝试df[(df.S11AQ1A20='Yes'))…
@Parfait你说得很对:)我有点错过了树木的森林。如果你提交一份包含一些数据的演示文件,以便可以复制你的问题,那会很有帮助。还要注意,你的检查df_helper.df['S12Q2A12']==1
与df_helper.df['S12Q2A12']=='YES'
因为第一个比较整数,而另一个比较字符串。这实际上取决于要使用哪个筛选器的列中的数据。关于使用条件选择数据帧中的行,有很多问题。如果您查看其中一些并解释为什么它们不存在,这将非常有用“我不能解决你的问题。MWE也很重要。现在投票结束,当你更新问题时会收回。好的,我会更新帖子,并尝试使问题更具可复制性。python中的字符串比较区分大小写('Yes'!='Yes'
),所以请尝试df[(df.S11AQ1A20='Yes')…
@Parfait你说得很对:)我有点怀念森林而不是树木。