将列添加到熊猫数据框以进行多索引

Posted

技术标签:

【中文标题】将列添加到熊猫数据框以进行多索引【英文标题】:Add column to pandas dataframe for multi index 【发布时间】:2017-04-06 16:50:40 【问题描述】:

我正在读取几个大型 (~700mb) CSV 文件以转换为数据帧,这些文件将全部合并为一个 CSV。现在,每个 CSV 都由每个 CSV 中的 date 列索引。所有 CSV 都有重叠的日期,但有唯一的测试位置。每个 CSV 都以其测试位置命名(例如 BER 和 ALT 测试站点的 ber.csv 和 alt.csv)。我怎样才能像这样多索引?现在我有:

def openFile(filesToProcess):
    df1 = pd.DataFrame()
    counter = 0
    for input in filesToProcess:
        base = os.path.splitext(basename(input))[0]
        print "Working on %s" % base
        with open(input, 'r') as input_file:
            #row_count = sum(1 for row in input_file)
            if counter == 0:
                df1 = createDataFrame(input_file)
            else:
                df2 = createDataFrame(input_file)
                df1 = pd.concat([df1,df2])
        counter += 1
        input_file.close()
    df1.to_csv('large.csv')

def createDataFrame(input_file):
    checkTime = time.clock()
    #print "Start DataFrame -- #%d" % counter
    df1 = pd.read_csv(input_file,
            sep = ",",
            nrows = 500,
            index_col = ['Date'])
    #print "End DataFrame -- #%d" % counter
    #print "Ran for " + str(time.clock() - checkTime) + " Seconds"
    return df1

比如说我想要

date, testsite, data1, data2
1/1/1992  9:15:00, ber, 89, 200
1/1/1992  9:17:00, ber, 54, 103.3
1/1/1992  9:15:00, alt, 90, 109.23
1/1/1992  9:17:00, alt, 12, 110.1

其中datetestsite 是多索引

【问题讨论】:

【参考方案1】:

设置

ber_df = pd.DataFrame([[89, 200], [54, 103.3]],
                      pd.DatetimeIndex(['1/1/1992  9:15:00', '1/1/1992  9:17:00'],
                                       name='date'),
                      ['data1', 'data2'])


alt_df = pd.DataFrame([[90, 109.23], [12, 110.1]],
                      pd.DatetimeIndex(['1/1/1992  9:15:00', '1/1/1992  9:17:00'],
                                       name='date'),
                      ['data1', 'data2'])


ber_df.to_csv('ber.csv')

alt_df.to_csv('alt.csv')

解决方案

filesToProcess = ['ber.csv', 'alt.csv']

def parse_file(fn):
    return pd.read_csv(fn, index_col=0, parse_dates=[0])

pd.concat(fn.replace('.csv', ''): parse_file(fn) for fn in filesToProcess) \
    .rename_axis(['testsite', 'date'], axis=0).swaplevel(0, 1).reset_index()

【讨论】:

以上是关于将列添加到熊猫数据框以进行多索引的主要内容,如果未能解决你的问题,请参考以下文章

熊猫添加更高级别的列多索引

Pandas 将列多索引转换为行多索引

折叠多索引数据框以进行回归

插值多索引熊猫数据框

正在进行的数字作为熊猫中的第一个多索引

如何在熊猫中使用具有多索引的地图?