2017-06-18 34 views
0

我有一個名爲的Pandas數據框data_match。它包含列'_worker_id','_unit_id'和'標題'。 (請參見本數據幀的一些行的附截圖)Python'reset_index(drop = True)'函數錯誤地刪除列

enter image description here

假設索引列未按升序排列(我想該指數爲0,1,2,3,4。 ..n),我希望它按升序排列。於是我就下面的函數嘗試重置索引列:
data_match = data_match.reset_index(降= TRUE)

我能得到的功能使用Python 3.6返回正確的輸出在我的電腦。但是,當我的同事使用Python 3.6在他的計算機上運行該功能時,'_worker_id'列被刪除。

這是由於 '(降= TRUE)' 條款旁邊的 'reset_index'?但我不知道它爲什麼在我的電腦中運行,而不是在我的同事的電腦中。任何人都可以建議嗎?

+0

reset_index(降= True)在你的計算機和同事的計算機上運行Python 3.6時肯定會起到同樣的作用。它不會放棄隨機列。 –

回答

1

俗話說,「口譯員會在你的口譯員身上留下什麼」 口譯員。如果不在Python交互式會話中輸入完整的命令歷史記錄,就不可能解釋差異。

然而,就可以大膽猜測:

df.reset_index(drop=True) 下降數據框的當前索引並與 增加整數索引來替換它。它從不丟棄列。

因此,在您的互動會話中,_worker_id是一列。在您的同事 互動式會話中,_worker_id必須是索引級別。

視覺差異可能有點微妙。例如,下面,df具有 _worker_id柱而df2具有_worker_id指數級:

In [190]: df = pd.DataFrame({'foo':[1,2,3], '_worker_id':list('ABC')}); df 
Out[190]: 
    _worker_id foo 
0   A 1 
1   B 2 
2   C 3 

In [191]: df2 = df.set_index('_worker_id', append=True); df2 
Out[191]: 
       foo 
    _worker_id  
0 A    1 
1 B    2 
2 C    3 

注意,名稱_worker_id下方出現foo一條線時,它是一個 索引電平,並且在同一行作爲foo當它是一列時。在查看DataFrame的strrepr時,您只能獲得這樣的 視覺線索。

如此重複:當_worker_index是一列,列不受 df.reset_index(drop=True)

In [194]: df.reset_index(drop=True) 
Out[194]: 
    _worker_id foo 
0   A 1 
1   B 2 
2   C 3 

_worker_index被丟棄時,它是指數的一部分:

In [195]: df2.reset_index(drop=True) 
Out[195]: 
    foo 
0 1 
1 2 
2 3 
+0

謝謝,@unutbu!真的很感謝你的回答。我已將您的反饋轉發給我的同事,他說這正是發生了什麼事,在執行'reset_index(drop = True)'函數之前,'_worker_id'列成爲索引列而不是數據幀列。所以他必須在腳本的前面做一些事情,使'_worker_id'成爲索引列。 有沒有一種方法可以強制Python不將數據框列更改爲索引列? – Stanleyrr

+0

有多個列值可能成爲索引的一部分。 'set_index','pivot','pivot_table','groupby' DataFrame方法都可以產生這種效果。如果您使用這些方法,則無法阻止列值移動到索引 - 畢竟,這是預期的效果!但是,在事實之後,您可以通過調用'df.reset_index(drop = False)'將索引級別移回列。 – unutbu