簡體   English   中英

Pandas中位數的奇怪行為

[英]Strange behavior with Pandas median

考慮以下數據幀:

       b           c     d     e  f     g     h
0   6.25  2018-04-01  True   NaN  7  54.0  64.0
1  32.50  2018-04-01  True   NaN  7  54.0  64.0
2  16.75  2018-04-01  True   NaN  7  54.0  64.0
3  29.25  2018-04-01  True   NaN  7  54.0  64.0
4  21.75  2018-04-01  True   NaN  7  54.0  64.0
5  21.75  2018-04-01  True  True  7  54.0  64.0
6   7.75  2018-04-01  True  True  7  54.0  64.0
7  23.25  2018-04-01  True  True  7  54.0  64.0
8  12.25  2018-04-01  True  True  7  54.0  64.0
9  30.50  2018-04-01  True   NaN  7  54.0  64.0

(復制並粘貼並使用df = pd.read_clipboard()來創建數據幀)

找到中位數最初沒有問題:

df.median()

b    21.75
d     1.00
e     1.00
f     7.00
g    54.00
h    64.00
dtype: float64

但是,如果列被刪除,然后將median被發現,為列中值e消失:

new_df = df.drop(columns=['b'])
new_df.median()

d     1.0
f     7.0
g    54.0
h    64.0
dtype: float64

這種行為有點意外,找到列e的中位數仍然有效:

new_df['e'].median()
1.0

使用skipna=False並沒有什么區別:

new_df.median(skipna=False)

d     1.0
f     7.0
g    54.0
h    64.0
dtype: float64

(它適用於原始數據幀):

df.median(skipna=False)

b    21.75
d     1.00
e      NaN
f     7.00
g    54.00
h    64.00
dtype: float64

e的數據類型是dfnew_df object ,兩個數據幀之間的唯一區別是new_df沒有列b 將列添加回new_df無法解決問題。 這僅在第一列b被刪除時發生。 如果列e是浮點數或整數數據類型,則不會發生這種情況。

pandas==0.22.0pandas==0.24.1中都存在此行為

現在有一個開放的GitHub問題 ,任何人都可以嘗試解決這個問題!

這似乎是一個錯誤。 當我們將任何df調度到median ,這將映射到內部_reduce函數。 隨着numeric_only設置為None ,這由一系列的計算中位數,而忽略失敗(對於c列,對於如中值計算將失敗。)和累積結果(見_reduce在大熊貓源核心/ frame.py)。 到目前為止一切都很好。 但是,當通過它將結果拼湊在一起時,會檢查以確定結果是標量還是序列(對於median它當然會是標量)。 做此項檢查,它總是用第一列(見wrap_results在大熊貓源核心/ apply.py)。 因此,如果第一列calc失敗並且被跳過,則此檢查失敗,引發異常。 這會觸發_reduce中的回退方法, _reduce強制數據幀為數字(刪除任何具有NaN列)並重新計算中位數。

因此,在您的情況下,如果列c(或中值計算將失敗的任何其他dtype,如文本)位於第一列,則所有具有NaN列也將被刪除以獲得中值結果。 設置skipna不會改變,因為錯誤是第一個位置的非數字列如何觸發強制數字計算。 如果沒有在pandas代碼庫中修復它,我沒有看到任何修復。 或者確保第一列始終成功進行中值計算。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM