繁体   English   中英

从pandas数据框的列索引获取字符串列表

[英]Obtain list of strings from column index of pandas dataframe

首先,这是我的.xlsx时间序列数据的样子:

数据在Excel中是什么样的

这是我的阅读方式:

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)

我需要做的是将列标签AND单位(第2行和第3行)以及值读入pandas数据框中,并能够以字符串列表的形式访问标签和单位行。 我似乎无法弄清楚如何加载第2行和第3行,以及如何正确地将时间读入pandas datetimeindex中,但是如果我仅上传标签,效果很好。 另外,我到处都看过了,无法弄清楚如何将列标题作为列表获取。

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

首先, for i in range(len(filepaths))消除它! for i, filepath in enumerate(filepaths) pythonic方式是for i, filepath in enumerate(filepaths) enumerate给出一个元组,因此您可以说ExcelFile(filepath)而不是ExcelFile(filepaths[i])

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

您可以使用层次索引来获取(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

这应该使您到达代码中开始删除列并开始连接的地步。 还可以看看开发人员文档 似乎正在清理用于读取excel文件的语法(好多了!)。 您也许可以将parse_cols参数与一个整数列表一起使用,以避免以后删除列。

哦,您可以使用df_data.columns.tolist()获得字符串列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM