从熊猫数据框的列索引中获取字符串列表

Posted

技术标签:

【中文标题】从熊猫数据框的列索引中获取字符串列表【英文标题】:Obtain list of strings from column index of pandas dataframe 【发布时间】:2013-07-21 23:00:21 【问题描述】:

首先,我的 .xlsx 时间序列数据如下所示:

这是我的阅读方式:

def loaddata(filepaths):
    t1 = time.clock()
    for i in range(len(filepaths)):
        xl = pd.ExcelFile(filepaths[i])
        df = xl.parse(xl.sheet_names[0], header=0, index_col=2, skiprows=[0,2,3,4], parse_dates=True)
        df = df.dropna(axis=1, how='all') 
        df = df.drop(['Decimal Year Day', 'Decimal Year Day.1', 'RECORD'], axis=1)
        df.index = pd.DatetimeIndex(((df.index.asi8/(1e9*60)).round()*1e9*60).astype(np.int64)).values

        if i == 0:
            dfs = df
        else:
            dfs = concat([dfs, df], axis=1)

    t2 = time.clock()
    print "Files loaded into dataframe in %s seconds" %(t2-t1)

    return dfs

files = ["London Lysimeters corrected 5min.xlsx"]
data = loaddata(files)

我需要做的是将列标签和单位(第 2 行和第 3 行)以及值读取到 pandas 数据框中,并能够以字符串列表的形式访问标签和单位行。我似乎无法弄清楚如何加载第 2 行和第 3 行并将时间正确读入 pandas datetimeindex,但如果我只上传标签,它就可以正常工作。此外,我到处寻找,无法弄清楚如何将列标题作为列表获取。

如果有人能帮助解决这些问题,我将不胜感激。

【问题讨论】:

【参考方案1】:

首先,摆脱那个for i in range(len(filepaths))! pythonic方式是for i, filepath in enumerate(filepaths)enumerate 给出一个元组,所以你可以说 ExcelFile(filepath) 而不是 ExcelFile(filepaths[i])

我认为你的两个问题是相关的。如果我正确阅读了您的代码,那么当您包含第 2 行和第 3 行时,由于时间戳列不是同质的,因此无法解析日期。并不是所有的时间戳。

您可以使用Hierarchical index 来获取(column, label, unit) 格式的数据。首先读取标题信息可能是最简单的。然后分别读取数据并在事后设置列(我现在没有方便的excel,但我认为我使用的所有read_csv选项也可用于xlrd):

In [7]: df_header = pd.read_csv('test.csv', nrows=2, index_col='three')

In [8]: df_header
Out[8]: 
               one      two    four
three                              
Timestamp  Decimal  Decimal  record
ts             ref      ref      rn

In [9]: df_data = pd.read_csv('test.csv', names=df_header.columns,
   ...:                       skiprows=4, parse_dates=True, index_col=2)

In [10]: df_data
Out[10]: 
                      one   two  four
2012-08-29 07:10:00  32.1  32.0   232
2012-08-29 09:10:00   1.1   1.2   233

In [11]: cols = pd.MultiIndex.from_tuples([tuple([x] + df_header[x].tolist())
   ....:                                   for x in df_header])

In [12]: cols
Out[12]: 
MultiIndex
[one   Decimal  ref, two   Decimal  ref, four  record   rn ]

In [14]: df_data.columns = cols

In [15]: df_data
Out[15]: 
                         one      two    four
                     Decimal  Decimal  record
                         ref      ref      rn
2012-08-29 07:10:00     32.1     32.0     232
2012-08-29 09:10:00      1.1      1.2     233

这应该让您在代码中开始删除列并开始连接。另请查看developers docs。看起来读取 excel 文件的语法正在被清理(好多了!)。您也许可以将 parse_cols 参数与整数列表一起使用,以避免以后删除列。

哦,你可以用df_data.columns.tolist()得到字符串列表

【讨论】:

不幸的是,我无法进行双重阅读,因为加载每张纸需要 30-40 秒,并且程序每次都需要加载 12-16 张相同尺寸的纸,即使第一张每个文件的读取量很小,它仍然需要相当长的时间才能开始。但是,能够获取字符串将非常方便,因为我现在可以使用它们来创建一个组合框并绘制数据,只是目前没有单位。谢谢! 也许考虑将块大小设置为等于标头长度并连接除第一个块之外的所有块。这会将其拆分为标题、数据,而每个文件只打开一次。

以上是关于从熊猫数据框的列索引中获取字符串列表的主要内容,如果未能解决你的问题,请参考以下文章

Python Pandas:从多级列索引中删除一列?

从熊猫列中获取字符串值

按列索引熊猫数据框重命名列

如何在python中获取熊猫数据框的行列表? [复制]

将数组列表作为列附加到具有相同列索引的熊猫数据框中

熊猫数据框检查索引是不是存在于多索引中