在我使用索引的数据中是复合 - 即它具有项目名称和时间戳,例如, [email protected]|2013-05-07 05:52:51 +0200
。在熊猫中将索引转换成多索引(分层索引)
我想做分层索引,以便将相同的电子邮件分组在一起,因此我需要将DataFrame索引转换为MultiIndex(例如,对于上面的条目 - ([email protected], 2013-05-07 05:52:51 +0200)
)。
什么是最方便的方法呢?
在我使用索引的数据中是复合 - 即它具有项目名称和时间戳,例如, [email protected]|2013-05-07 05:52:51 +0200
。在熊猫中将索引转换成多索引(分层索引)
我想做分层索引,以便将相同的电子邮件分组在一起,因此我需要将DataFrame索引转换为MultiIndex(例如,对于上面的条目 - ([email protected], 2013-05-07 05:52:51 +0200)
)。
什么是最方便的方法呢?
一旦我们有一个数据帧
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'])
我更倾向于将最初读取此在作为列(即不是作为一个指标),那么你可以使用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
在pandas>=0.16.0
,我们可以使用.str
访问的指标。这使得以下可能:
df.index = pd.MultiIndex.from_tuples(df.index.str.split('|').tolist())
(注:我尝试了更直观:pd.MultiIndex.from_arrays(df.index.str.split('|'))
但出于某种原因,让我的错误。)
这是非常有益的。但是,据我所知,在调用set_index()时,默认值是inplace = False,所以必须使用inplace = True,否则将df指定给自己。 – Moot
@Moot谢谢,更新。无论是错字还是背单词(4年前),默认情况下它都是“inplace”。 –
太棒了!但有两个地方 - 检查代码的第一个片段... – Moot