繁体   English   中英

pandas数据框:从单索引更改为多列索引

[英]pandas dataframe: Changing from single index to multi-column index

在python熊猫中,我有一个数据框

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_aaa附加到df_all,并让它们具有符号和日期的复合索引。

  1. 我怎么做?

基本上,以下所有问题都是: 如何设置多索引并在添加时使用它 我可以用不同的列顺序吗? 我需要刷新吗? 等等。:

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

  • 我必须首先将两个数据框的索引都设置为多索引,以便追加能够正常工作吗? (否则,我将重复使用不同的符号

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

  • 有没有数据但没有索引的数据帧吗?

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

  • 什么时候使用以下哪个数据set_index()方法: set_index()reindex()reset_index()set_levelreset_level

  • 为这些方法提供数组时的默认值是什么。 Python文档令人生畏,但我找不到它们的手或脚。 提供一些好的例子会有所帮助...
  • 设置索引时是否需要添加任何内容(例如axis=1 )?

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

  • 在附加并假设旧索引正确之后,是否需要“更新”索引(也许使用reindex?),或者因为我告诉数据框该索引在某个列中,所以我的数据是否正确索引了?

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

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

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

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

请注意,这仅在您的数据框具有相同的column.s时有效。

如果将来必须执行多个附加操作,最好的方法是将其中一个添加为另一个,然后进行串联,并根据需要重置索引。


我将一一回答您所有的问题。

我不确定多索引是具有多个“列”(或行)的索引,还是具有多个索引(并且其中任何一个可能用于多个列或行)的能力。 还是都正确?

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

我必须首先将两个数据框的索引都设置为多索引,以便追加能够正常工作吗? (否则,我将重复使用不同的符号

没必要。 尽管可以,但是在这种情况下不这样做会更简单。

创建新索引之前,我是否必须“删除”现有索引? 不,只是列必须对齐(列名和列数应相同)。

有没有数据但没有索引的数据帧吗?

否。所有行都已建立索引。 即使没有列作为索引,索引也是单调递增的数字。 此处遵循的模型与RDBM中的模型相似。

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

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

什么时候使用以下哪个数据框方法:set_index(),reindex(),reset_index(),set_level,reset_level?

这是一个广泛的问题。 这取决于您何时要对索引进行操作,如果要对索引进行操作,该如何处理? 仔细阅读每个文档。

只需附加df和reset_index()即可使用keys参数设置set_index() 这是单线纸:

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

这是我从答案中收集并拖动文档的内容:

有一个“默认索引”,它是每行的“行号”,并且不属于任何列。

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

但是,如果要在将索引设为“非标准”后更改索引,则必须“ reset_index()”并将其恢复为默认值,然后从那里可以创建新的多重索引(如修订版中所述)下面的答案)

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

我仍然不确定在合并后是否必须重新索引一列,但是据此看来,您会得到一个自动生成的新“默认索引”,并且必须保存旧索引,并在合并之前删除索引(reset_index ),并在完成后再次设置。

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

这是后续行动。

暂无
暂无

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

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