Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据分类变量的条件对数据帧进行子集_Python_Pandas_Dataframe_Conditional Statements_Subset - Fatal编程技术网

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

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

我的目标

我正在努力根据分类变量S11AQ1A20的内容创建数据帧的子集。在我遇到的所有howto中,分类变量都包含字符串数据,但在我的例子中,它是具有特定含义的整数值(YES=1,NO=0,9=Unknown)。因此,我添加了类别,以便熊猫能够正确地标记这些值

理想情况下,下面示例代码中的情况A和B在完成子集设置后将包含5行。但目前,它只有在不标记整数值的情况下才起作用

到目前为止我已经知道了什么

  • 案例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你说得很对:)我有点怀念森林而不是树木。