【问题标题】:Pandas Read Excel: how to access a given cell by column and row numbersPandas Read Excel:如何通过列号和行号访问给定的单元格
【发布时间】:2016-09-11 05:29:57
【问题描述】:

使用 Pandas 模块和 read_excel 函数,我可以为我从 excel 文件中读取的每一列分配一个数字分配作为列标题,而不是使用 g_int_c=str(df1['Unnamed: 1'][6]) 来引用 excel 中的一段数据文件,我可以使用g_int_c=str(df1[1][6])?

示例代码如下:

import pandas as pd

with pd.ExcelFile(inputFile,
                      sheetname=['pnl1 Data ','pnl2 Data','pnl3 Data','pnl4 Data']) as xlsx:
        df1 = pd.read_excel(xlsx, 'pnl1 Data ',skiprows=9, parse_cols="B:H", keep_default_na='FALSE', na_values=['NULL'])#assign column headers
        df2 = pd.read_excel(xlsx, 'pnl2 Data', skiprows=9, parse_cols="B:H", keep_default_na='FALSE', na_values=['NULL'])
        df3 = pd.read_excel(xlsx, 'pnl3 Data', skiprows=9, parse_cols="B:H", keep_default_na='FALSE', na_values=['NULL'])
        df4 = pd.read_excel(xlsx, 'pnl4 Data', skiprows=9, parse_cols="B:H", keep_default_na='FALSE', na_values=['NULL'])

【问题讨论】:

标签: python excel pandas


【解决方案1】:

header=None,names=[0,1,2,3,4,5,6] 工作。

with pd.ExcelFile(inputFile,
                      sheetname=['pnl1 Data ','pnl2 Data','pnl3 Data','pnl4 Data']) as xlsx:
        df1 = pd.read_excel(xlsx, 'pnl1 Data ',skiprows=10, parse_cols="B:H", keep_default_na='FALSE', na_values=['NULL'],header=None,names=[0,1,2,3,4,5,6])#assign column headers
        df2 = pd.read_excel(xlsx, 'pnl2 Data', skiprows=10, parse_cols="B:H", keep_default_na='FALSE', na_values=['NULL'],header=None,names=[0,1,2,3,4,5,6])
        df3 = pd.read_excel(xlsx, 'pnl3 Data', skiprows=10, parse_cols="B:H", keep_default_na='FALSE', na_values=['NULL'],header=None,names=[0,1,2,3,4,5,6])
        df4 = pd.read_excel(xlsx, 'pnl4 Data', skiprows=10, parse_cols="B:H", keep_default_na='FALSE', na_values=['NULL'],header=None,names=[0,1,2,3,4,5,6])

【讨论】:

    【解决方案2】:

    要获得漂亮的列名而不是像'Unnamed: 1' 这样的默认值,请使用pd.read_excelnames 参数。比照,尝试替换

    with pd.ExcelFile(inputFile,
                      sheetname=['pnl1 Data ','pnl2 Data','pnl3 Data','pnl4 Data']) as xlsx:
        df1 = pd.read_excel(xlsx, 'pnl1 Data ',skiprows=9, parse_cols="B:H", keep_default_na='FALSE', na_values=['NULL'])#assign column headers
        df2 = pd.read_excel(xlsx, 'pnl2 Data', skiprows=9, parse_cols="B:H", keep_default_na='FALSE', na_values=['NULL'])
        df3 = pd.read_excel(xlsx, 'pnl3 Data', skiprows=9, parse_cols="B:H", keep_default_na='FALSE', na_values=['NULL'])
        df4 = pd.read_excel(xlsx, 'pnl4 Data', skiprows=9, parse_cols="B:H", keep_default_na='FALSE', na_values=['NULL'])
    

    sheets = ['pnl1 Data','pnl2 Data','pnl3 Data','pnl4 Data']
    df = pd.read_excel(inputFile, sheetname=sheets, skiprows=9, parse_cols="B:H", 
                       names=list('BCDEFG'))
    df = {i: df[sheet] for i, sheet in enumerate(sheets, 1)}
    

    这将使df 成为一个字典,其键是工作表编号,其值是 数据帧。 DataFrame 将具有列名称 BG,大致类似于 原始 Excel 文件。

    因此,您无需引用编号变量df1、...、df4(通常为a bad idea),而是在字典df 中拥有所有DataFrame,并且能够访问它们通过数字索引:df[1], ..., df[4]。例如,工作表pnl3 Data 将作为df[3] 访问。

    要访问第七行,B 工作表 'pnl1 Data' 的列值可以使用:

    g_int_c = str(df[1].loc[6, 'B'])
    

    例如,

    import pandas as pd
    try: from cStringIO import StringIO         # for Python2
    except ImportError: from io import StringIO # for Python3
    import textwrap
    df1 = pd.read_csv(StringIO(textwrap.dedent("""
              ,,,
              0,1,2,3
              1,4,5,6
              7,8,9,10""")))
    df2 = pd.read_csv(StringIO(textwrap.dedent("""
              ,,,
              0,NULL,2,3
              1,4,NULL,NULL""")), converters={i:str for i in range(4)})
    
    sheets = ['pnl1 Data','pnl2 Data']
    
    writer = pd.ExcelWriter('/tmp/output.xlsx')
    for df, sheet in zip([df1, df2], sheets):
        print(df)
        #   Unnamed: 0 Unnamed: 1 Unnamed: 2 Unnamed: 3
        # 0          0       NULL          2          3
        # 1          1          4       NULL       NULL
        df.to_excel(writer, sheet)
    writer.save()
    
    df = pd.read_excel('/tmp/output.xlsx', sheetname=sheets, names=list('ABCD'), parse_cols="A:E")
    df = {i: df[sheet] for i, sheet in enumerate(sheets, 1)}
    
    for key, dfi in df.items():
        print(dfi)
        #    A  B  C   D
        # 0  0  1  2   3
        # 1  1  4  5   6
        # 2  7  8  9  10
        #    A    B    C    D
        # 0  0  NaN  2.0  3.0
        # 1  1  4.0  NaN  NaN
    
    print(df[1].loc[1, 'B'])
    # 4
    

    【讨论】:

      【解决方案3】:

      从您的问题来看,这不是关于在导入时为列分配数值,而是关于如何通过列号和行号访问表格的给定单元格,这是一个专门关于如何索引的问题或按整数切片数据帧。

      在您的示例中,您提到想要引用df1[1][6]。您可以使用.iloc 来执行此操作。

      # spin up a df
      df = pd.DataFrame(np.random.randint(0,10,size=(7, 7)), columns=list('ABCDEFG'))
      print df
      

      输出:

         A  B  C  D  E  F  G
      0  0  7  7  8  8  2  2
      1  8  2  9  1  6  8  1
      2  5  3  5  5  9  2  7
      3  7  4  2  1  1  5  0
      4  0  4  4  1  9  7  1
      5  4  2  7  7  9  7  2
      6  0  6  7  8  1  4  1
      

      现在使用.iloc按整数索引:

      df.iloc[1,6] 
      

      输出:

      1
      

      要返回上面的代码,您很可能会将其更改为以下内容:

      g_int_c=str(df.iloc[1,6])
      

      对于一般参考,这里是索引和切片数据帧的文档:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-integer

      此问答可能会有所帮助:How to get column by number in Pandas?

      【讨论】:

      • 既然这被选为接受的答案,请更新问题标题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      相关资源
      最近更新 更多