pandas dataframe:从单索引更改为多列索引

时间:2017-11-08 15:57:22

标签: python pandas dataframe

在python pandas中我有一个数据框

df_aaa:

date     data  otherdata symbol
2015/1/1 11    12         aaa
2015/2/1 21    22         aaa
2015/3/1 31    31         aaa

df_all:

2015/1/1 31    31         bbb

目前两者的索引均为 date

我想将df_aa附加到df_all,并使用符号和日期的复合索引。

  1. 我该怎么做?
  2. 基本上以下都是一个问题:如何设置多索引并在追加时使用。我可以使用不同的列顺序吗?我需要刷新吗?等等:

    • 我不确定multi-index是否是具有多个“列”(或行)的索引,或者它是否能够拥有多个索引(并且它们中的任何一个都可能是用于多列或多行)。或者都是正确的?

    • 首先必须将两个数据帧的索引设置为多索引,因此追加会有效吗? (否则我会为不同的符号重复

    • 在创建新索引之前,是否必须“删除”现有索引?

    • 是否存在包含数据但没有索引的数据框?

    • (单个)索引必须具有唯一值吗?

    • 我何时使用以下哪种数据框方法:set_index()reindex()reset_index()set_levelreset_level

    • 当我给这些方法一个数组时,默认是什么。 Python文档令人生畏,我无法在其中找到我的手或腿。给出一些好的例子会有所帮助......
    • 设置索引时是否需要添加任何内容(例如axis=1)?

    • 如何将索引设置为列中的数据。 (为什么有时使用['symbol','date']作为参数,给我一个包含这两个值的新列,而不是用这两个名称设置列的现有值的索引?)

    • 在我追加并假设旧索引是正确的之后我是否需要'更新'索引(可能使用reindex?)或者因为我告诉数据框索引在某个列中,我的数据是否正确索引?

    • 由于我的数据帧(将)具有相同列名的索引,即使df_all被定义为使列最初具有不同的顺序,我也可以在df_all上附加df_aaa。 (比如说:''''','date','data','otherdata'],第一列是符号)?

3 个答案:

答案 0 :(得分:2)

您可以将它们连接起来,然后然后设置索引。

df_aaa = df_aaa.reset_index()
df_all = df_all.reset_index()

df = df_aaa.append(df_all).set_index(['symbol', 'date'])

请注意,仅当您的数据框具有相同的列时,这才有效。

如果您将来必须执行多个追加,最好的办法是将其中一个添加到另一个中,执行连接,并根据需要重置索引。

我会逐一回答你的所有问题。

  

我不确定多索引是否是包含多个'列的索引。   (或行),或者是否有能够拥有多个索引(以及任何索引)   它们可以用于多列或多行)。或者都是正确的?

这取决于您所指的轴。沿着行(0 th 轴),您有2个或更多列形成MultiIndex。类似地沿着列(1 st 轴)。

  

我必须先将两个数据帧的索引设置为多索引,所以   追加会有效吗? (否则我会有不同的副本   符号

没有必要。虽然你可以,但在这种情况下不这样做会更简单。

  

我是否必须"掉落"在创建新索引之前的现有索引?   不,只是列必须对齐(列名和列数应该相同)。

     

是否存在具有数据但没有索引的数据框?

没有。所有行都被编入索引。即使没有列作为索引,索引也是单调递增的数字。这里遵循的模型类似于RDBM中的模型。

  

(单个)索引必须具有唯一值吗?

通常,必须,因此可以唯一标识行。如果您有MultiIndex,则构成索引的每个值组合必须是唯一的。

  

我何时使用以下哪种数据帧方法:set_index(),   reindex(),reset_index(),set_level,reset_level?

这是一个广泛的问题。这取决于你何时想对索引进行操作?如果是,你想用它做什么?仔细查看每个文档的文档。

答案 1 :(得分:2)

只需附加df&{39}和reset_index()就可以set_index()keys个参数。这是oneliner:

df_all = df_all.append(df_aaa).reset_index().set_index(keys=['symbol', 'date'])

这是完整的工作样本。

In [1]: import pandas as pd
   ...: from io import StringIO
   ...: 

In [2]: df_aaa = pd.read_csv(StringIO("""date     data  otherdata symbol
   ...: 2015/1/1 11    12         aaa
   ...: 2015/2/1 21    22         aaa
   ...: 2015/3/1 31    31         aaa
   ...: """), sep="\s+", index_col='date')
   ...: 

In [3]: df_all = pd.read_csv(StringIO("""date     data  otherdata symbol
   ...: 2015/1/1 31    31         bbb"""), sep="\s+", index_col='date')
   ...: 

In [4]: df_all.append(df_aaa).reset_index().set_index(keys=['symbol', 'date'])
Out[4]: 
                 data  otherdata
symbol date                     
bbb    2015/1/1    31         31
aaa    2015/1/1    11         12
       2015/2/1    21         22
       2015/3/1    31         31

答案 2 :(得分:1)

以下是我从答案中收集并浏览文档的内容:

有一个"默认索引"这是一个"行号"对于每一行,并且不属于任何列。

当与该索引合并时,似乎(似乎)不需要重新索引。

但是如果我想在制作之后更改索引"非标准"我必须" reset_index()"并将其恢复为默认值,然后从那里我可以创建新的多索引(如下面修订的答案中所述)

多索引是具有多个键的索引(即,如果索引行,则将使用多个列)。

我仍然不确定在合并后是否必须重新索引列,但是according to this它似乎会获得一个自动生成的新"默认索引"并且必须保存旧的,在合并之前删除索引(reset_index)并在完成后再次设置它。

关于索引替换列的另一个问题 - 我将检查并返回此处。

这是一个后续行动。