【问题标题】:Python Pandas - Dropping multiple columns through listPython Pandas - 通过列表删除多列
【发布时间】:2020-02-01 05:57:27
【问题描述】:

我尝试搜索这个问题的答案,但找不到它......所以就这样吧。

我有一个包含 23987 列的数据集。我实际上只想要其中 35 个列中的信息(它们之间相当分散)。我已将这 35 个项目列在一个列表中。我想知道是否有一种快速的方法通过传递列表删除除列之外的所有列

我试过这个:

df1.drop(df1.columns.difference([ALTJ_genes]), axis=1, inplace=True)

ALTJ_genes 是包含 35 个项目的列表。我得到的错误是:

TypeError: unhashable type: 'list'

我想知道是否有办法做到这一点,我知道我可以通过传递各个列来达到我的目标,但我想知道列表是否可行。这将使代码更清晰。

无论如何,谢谢!

编辑:我提供了一些截图,也许有用。

现在,这是我在传递包含所有基因的列表时得到的完整错误。

---------------------------------------------------------------------------

KeyError Traceback(最近一次调用最后一次) 在 ----> 1 df1[ALTJ_genes]

/opt/anaconda3/lib/python3.7/site-packages/pandas/core/frame.py in getitem(self, key) 2984 如果 is_iterator(key): 第2985章 -> 2986 索引器 = self.loc._convert_to_indexer(key, axis=1, raise_missing=True) 2987 2988 # take() 不接受布尔索引器

/opt/anaconda3/lib/python3.7/site-packages/pandas/core/indexing.py in _convert_to_indexer(self, obj, axis, is_setter, raise_missing) 1283 # 设置时,即使使用 .loc,也不允许缺少键: 1284 kwargs = {“raise_missing”:如果is_setter为真,否则为raise_missing} -> 1285 返回 self._get_listlike_indexer(obj, axis, **kwargs)1 1286 其他: 1287尝试:

/opt/anaconda3/lib/python3.7/site-packages/pandas/core/indexing.py in _get_listlike_indexer(self, key, axis, raise_missing) 1090 第1091章 -> 1092 keyarr,索引器,o._get_axis_number(轴),raise_missing=raise_missing 1093) 1094 返回keyarr,索引器

/opt/anaconda3/lib/python3.7/site-packages/pandas/core/indexing.py in _validate_read_indexer(self, key, indexer, axis, raise_missing) 第1175章 第1176章 -> 1177 键=键,轴=self.obj._get_axis_name(轴) 第1178章) 第1179章

KeyError: "None of [Index([ ('APEX1',), ('ASF1A',), ('CDKN2D',), ('CIB1',), ('DNA2',),\n ( 'FAAP24',), ('FANCM',), ('GEN1',), ('HRAS',), ('LIG1',),\n ('LIG3',), ('MEN1',), ('MRE11',), ('MSH3',), ('MSH6',),\n ('NUDT1',), ('MTOR',), ('NABP2',), ('NTHL1',) , ('PALB2',),\n ('PARP1',), ('PARP3',), ('POLA1',), ('POLM',), ('POLQ',),\n ('PRPF19 ',), ('RAD51D',), ('RBBP8',), ('RRM2',), ('RUVBL2',),\n ('SOD1',), ('KAT5',), (' UNG',), ('WRN',), ('XRCC1',)],\n dtype='object', name='Gene_Name')] 在[列]"

【问题讨论】:

    标签: python pandas list


    【解决方案1】:

    我认为您需要删除[],因为ALTJ_genes 是列表,[ALTJ_genes] 是嵌套列表:

    df1.drop(df1.columns.difference(ALTJ_genes), axis=1, inplace=True)
    

    但更简单的是按列表选择列:

    df1 = df1[ALTJ_genes]
    

    编辑:

    我认为问题在于带有嵌套列表的定义列,所以获取一级非标准 MultiIndex:

    df1 = pd.DataFrame([[1,2,3,4]])
    #nested list
    df1.columns = [['APEX1', 'ASF1A', 'CDKN2D', 'AAA']]
    print (df1) 
      APEX1 ASF1A CDKN2D AAA
    0     1     2      3   4
    
    print (df1.columns)
    MultiIndex([( 'APEX1',),
                ( 'ASF1A',),
                ('CDKN2D',),
                (   'AAA',)],
               )
    

    如果传递非嵌套列表:

    df1 = pd.DataFrame([[1,2,3,4]])
    #not nested list
    df1.columns = ['APEX1', 'ASF1A', 'CDKN2D', 'AAA']
    print (df1) 
       APEX1  ASF1A  CDKN2D  AAA
    0      1      2       3    4
    
    print (df1.columns)
    Index(['APEX1', 'ASF1A', 'CDKN2D', 'AAA'], dtype='object')
    

    【讨论】:

    • 感谢这个耶兹瑞尔!我尝试了选择列的方式,但它不起作用,也许我做错了什么,因为当我从列表中选择多个列时:df1[['APEX1','ASF1A','CDKN2D']] 我得到了一个结果但是当我通过我的列表时,它说“[Index([ ('APEX1',), ('ASF1A',), ('CDKN2D',) ... name='Gene_Name')] 都没有在 [columns ]”,真的输了!但是非常感谢,它让我思考并给了我一些尝试的新想法!
    • @JourneyDS - 如何创建DataFrame
    • @JourneyDS - 已编辑答案以解释可能的问题。
    • DataFrame 来自一个由标签分隔的 CSV 文件,我可以发布更多信息,也许有助于发现问题
    • 可能我点击了两次,现在应该是绿色的
    猜你喜欢
    • 2021-05-06
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多