【问题标题】:Access column by position or index in pandas在熊猫中按位置或索引访问列
【发布时间】:2017-09-06 09:53:36
【问题描述】:

我有一个如下列表,我在 csv 文件中搜索它以获取与之关联的项目代码。例如,对于 0 -> 项目代码是 11nm

L = [0, 2]

CSV file:
0, 11nm
1, 22nm
2, 33nm
3, 44nm

我目前的做法如下。

df = pd.read_csv('item_code.csv', sep = ',')
item_codes= df[df["No"].isin(L)]["item_code"].tolist()

但是,现在我想知道当文件标题(否,item_code)不可用时,如何对 csv 文件执行相同的操作。

请帮帮我。

【问题讨论】:

    标签: python pandas csv dataframe


    【解决方案1】:

    当列名不可用时,您可以使用df.iloc通过索引引用它们:

    item_codes = df[df.iloc[:, 0].isin(L)].iloc[:, 1].tolist()
    

    MCVE:

    import pandas as pd
    import numpy as np
    import io
    
    text = \
    '''0, 11nm
    1, 22nm
    2, 33nm
    3, 44nm'''
    
    buf = io.StringIO(text)    
    df = pd.read_csv(buf, sep=',\s*', header=None, engine='python') # no column names
    print(df) 
    
       0     1
    0  0  11nm
    1  1  22nm
    2  2  33nm
    3  3  44nm
    
    L = [0, 2]
    item_codes = df[df.iloc[:, 0].isin(L)].iloc[:, 1]
    print(item_codes)
    
    0    11nm
    2    33nm
    Name: 1, dtype: object
    
    print(item_codes.tolist())
    ['11nm', '33nm']
    

    注意事项:

    • sep=',\s*' 是一个正则表达式模式(用于指定列分隔符)
    • header=None 将阻止分配任何行
    • engine='python' 选择正则表达式引擎

    【讨论】:

      【解决方案2】:

      您可以使用参数names 指定列名,选择列使用loc

      df = pd.read_csv('item_code.csv', names=['No','item_code'])
      print (df)
         No item_code
      0   0      11nm
      1   1      22nm
      2   2      33nm
      3   3      44nm
      
      
      item_codes= df.loc[df["No"].isin(L), "item_code"].tolist()
      print (item_codes)
      ['11nm', '33nm']
      

      或者使用参数header=None作为默认列名0,1...

      df = pd.read_csv('item_code.csv', header=None)
      
      print (df)
         0     1
      0  0  11nm
      1  1  22nm
      2  2  33nm
      3  3  44nm
      
      #first column selected by position with iloc
      item_codes= df.loc[df.iloc[:,0].isin(L), 1].tolist()
      print (item_codes)
      ['11nm', '33nm']
      

      #first column selected by column name
      item_codes= df.loc[df[0].isin(L), 1].tolist()
      print (item_codes)
      ['11nm', '33nm']
      

      【讨论】:

        【解决方案3】:

        header=None读取csv文件后,让pandas知道你的文件中没有标题:

        df = pd.read_csv('item_code.csv', sep = ',', header=None)
        

        您可以使用列索引代替列名。

        像这样:

        df[df[0].isin(L)][1].tolist()
        

        或者这个:

        df[df.iloc[:,0].isin(L)][1].tolist()
        

        说明:

        如果您在读取数据帧后打印数据帧,而没有带有print(df) 的标题

           0     1
        0  0  11nm
        1  1  22nm
        2  2  33nm
        3  3  44nm
        

        您会注意到,pandas 将数字 [0,1] 分配给列名,而不是未作为标题出现的 ["No", "item_code"]。因此,您可以像df[0]df.iloc[:, 0] 那样使用其索引来引用每一列。

        后者df.iloc[:, 0] 告诉pandas 取所有行,只取0 列。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-06
          • 1970-01-01
          • 1970-01-01
          • 2021-10-10
          • 2017-05-03
          • 2013-02-03
          相关资源
          最近更新 更多