如何在不转换列名类型的情况下调用整数列名筛选DataFrame?
解决方案:整数列名直接筛选DataFrame
错误原因分析
- Trial 1 报错:
isin()方法要求传入列表/可迭代对象,直接传单个整数0/1不符合参数要求,因此抛出类型错误。 - Trial 2 报错:
df.loc[:, [2]]返回的是DataFrame对象(而非Series),调用isin()后得到的是布尔值组成的DataFrame。当尝试用&组合条件时,pandas会尝试对齐索引,导致Timestamp类型的索引和整数布尔值出现不兼容的比较操作,触发类型错误。
正确实现方式
直接通过整数列名获取Series(而非DataFrame),再执行筛选操作即可,无需转换列名为字符串:
# 直接用整数列名获取Series,执行条件筛选 df_filtered = df[(df[2].isin([0])) & (df[8].isin([1]))] # 后续groupby也可直接使用整数列名 dfd = {'{0[0]}{0[1]}'.format(i): x for i, x in df_filtered.groupby([2, 8])}
也可以用loc语法获取单个列的Series:
df_filtered = df[(df.loc[:, 2].isin([0])) & (df.loc[:, 8].isin([1]))]
关键说明
- 当你用
df.loc[:, [2]](带方括号的列表形式)时,返回的是包含单列的DataFrame;而df.loc[:, 2](单个整数)或df[2]返回的是该列的Series。 - 布尔筛选需要用布尔值Series来匹配DataFrame的行索引,这样才能正确完成行筛选。
内容的提问来源于stack exchange,提问作者user_v27
相关产品推荐
相关产品推荐

