在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,并使用符号和日期的复合索引。
基本上以下都是一个问题:如何设置多索引并在追加时使用。我可以使用不同的列顺序吗?我需要刷新吗?等等:
我不确定multi-index
是否是具有多个“列”(或行)的索引,或者它是否能够拥有多个索引(并且它们中的任何一个都可能是用于多列或多行)。或者都是正确的?
首先必须将两个数据帧的索引设置为多索引,因此追加会有效吗? (否则我会为不同的符号重复
在创建新索引之前,是否必须“删除”现有索引?
是否存在包含数据但没有索引的数据框?
(单个)索引必须具有唯一值吗?
我何时使用以下哪种数据框方法:set_index()
,reindex()
,reset_index()
,set_level
,reset_level
?
设置索引时是否需要添加任何内容(例如axis=1
)?
如何将索引设置为列中的数据。 (为什么有时使用['symbol','date']作为参数,给我一个包含这两个值的新列,而不是用这两个名称设置列的现有值的索引?)
在我追加并假设旧索引是正确的之后我是否需要'更新'索引(可能使用reindex?)或者因为我告诉数据框索引在某个列中,我的数据是否正确索引?
由于我的数据帧(将)具有相同列名的索引,即使df_all被定义为使列最初具有不同的顺序,我也可以在df_all上附加df_aaa。 (比如说:''''','date','data','otherdata'],第一列是符号)?
答案 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)并在完成后再次设置它。
关于索引替换列的另一个问题 - 我将检查并返回此处。
这是一个后续行动。