2013-07-23 54 views

回答

9

一旦我们有一个数据帧

import pandas as pd 
df = pd.read_csv("input.csv", index_col=0) # or from another source 

和一个函数映射每个索引到一个元组(下面,它是用于从这个问题的例子)

def process_index(k): 
    return tuple(k.split("|")) 

我们可以创建一个分层索引通过以下方式:

df.index = pd.MultiIndex.from_tuples([process_index(k) for k,v in df.iterrows()]) 

另一种方法是创建两列然后将它们设置为的索引(原始索引将被丢弃):

df['e-mail'] = [x.split("|")[0] for x in df.index] 
df['date'] = [x.split("|")[1] for x in df.index] 
df = df.set_index(['e-mail', 'date']) 

或甚至更短

df['e-mail'], df['date'] = zip(*map(process_index, df.index)) 
df = df.set_index(['e-mail', 'date']) 
+0

这是非常有益的。但是,据我所知,在调用set_index()时,默认值是inplace = False,所以必须使用inplace = True,否则将df指定给自己。 – Moot

+0

@Moot谢谢,更新。无论是错字还是背单词(4年前),默认情况下它都是“inplace”。 –

+0

太棒了!但有两个地方 - 检查代码的第一个片段... – Moot

2

我更倾向于将最初读取此在作为列(即不是作为一个指标),那么你可以使用STR分方法:

csv = '\n'.join(['[email protected]|2013-05-07 05:52:51 +0200, 42'] * 3) 
df = pd.read_csv(StringIO(csv), header=None) 

In [13]: df[0].str.split('|') 
Out[13]: 
0 [[email protected], 2013-05-07 05:52:51 +0200] 
1 [[email protected], 2013-05-07 05:52:51 +0200] 
2 [[email protected], 2013-05-07 05:52:51 +0200] 
Name: 0, dtype: object 

再喂到这一个多指标(也许这是可以做到清洁剂):

m = pd.MultiIndex.from_arrays(zip(*df[0].str.split('|'))) 

删除第0列和索引设置为新的多指标:

del df[0] 
df.index = m 

In [17]: df 
Out[17]: 
              1 
[email protected] 2013-05-07 05:52:51 +0200 42 
       2013-05-07 05:52:51 +0200 42 
       2013-05-07 05:52:51 +0200 42 
3

pandas>=0.16.0,我们可以使用.str访问的指标。这使得以下可能:

df.index = pd.MultiIndex.from_tuples(df.index.str.split('|').tolist()) 

(注:我尝试了更直观:pd.MultiIndex.from_arrays(df.index.str.split('|'))但出于某种原因,让我的错误。)