【问题标题】:pandas dataframe: Changing from single index to multi-column index熊猫数据框:从单索引更改为多列索引
【发布时间】:2017-11-09 07:53:31
【问题描述】:

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

  1. 我该怎么做?

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

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

  • 我必须首先将两个数据帧的索引设置为多索引,这样追加才能起作用吗? (否则我会有不同符号的重复项

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

  • 有没有数据但没有索引的数据框这样的东西?

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

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

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

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

  • 1234563索引? 1234563 (比如:['symbol', 'date', 'data', 'otherdata'] 符号第一列)?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

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

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

    请注意,这只有在您的数据框具有相同的列时才有效。s

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


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

    我不确定多索引是否是具有多个“列”的索引 (或行),或者它是否能够拥有多个索引(以及任何 其中可能用于多列或多行)。还是两者都正确?

    这取决于您所指的轴。沿着行(第 0th 轴),您有 2 个或更多列形成一个 MultiIndex。沿列(1st 轴)也是如此。

    我必须首先将两个数据帧的索引设置为多索引,所以 追加会起作用吗? (否则我会有不同的重复 符号

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

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

    有数据但没有索引的数据框这样的东西吗?

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

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

    一般来说,必须,所以行可以被唯一标识。如果您有MultiIndex,则构成索引的每个值组合都必须是唯一的。

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

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

    【讨论】:

    • 请注意,在问题中,两个数据框当前都有一个日期索引。而不是汽车号码。关于各种数据框函数:我的意思是在这个问题的上下文中:在所有这些函数中,我都有“level =”和“columns =”而且我不明白 ['symbol', 'date'] 的默认值是什么.我在合并后做了 set_index,但没有正确设置列。
    • @pashute 您的两个数据框的当前索引是多少?尽管您的问题提供的背景有限,但我已尽力为您提供帮助。
    • @coldspeed 谢谢你!但是一个。如果我有日期索引,您的解决方案将不起作用。它给了我 2 行的 na。索引列没有名称,第 1 行有“符号”,第 2 行有“日期”。
    • @pashute 先调用reset_index,然后再连接。见编辑。
    【解决方案2】:

    只需将 df 和 reset_index() 附加到 set_index()keys 参数即可。这是单线:

    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
    

    【讨论】:

    • 您的回答与我的回答有何不同、形式或形式,几乎是 40 分钟后发布的?
    • 我正在提供完整的工作样本。不过你的速度更快:)
    • 我不明白这有什么不同。此外,OP 承认它不能按原样工作(需要稍作改动,请参阅我的回答)
    • 哦,你是对的。直到现在我才看到这个对话
    • 谢谢tworec!如果没有您的回答,我将无法理解 Coldspeed 的声明:我是否必须在创建新索引之前“删除”现有索引?不,只是列必须对齐(列名和列数应该相同)。 reset_index 当然就是这样做的。你们都没有回答重新索引的问题,也没有回答索引与列的问题。我会接受 ColdSpeed 的回答,但据我所知,对于我们程序员来说,我自己的另一个答案。
    【解决方案3】:

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

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

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

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

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

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

    关于索引替换列的另一个问题 - 我会检查并返回这里。

    这是一个后续。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 2021-12-08
      • 2020-04-01
      • 2016-06-13
      • 2020-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多