簡體   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