[英]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
的數據類型是df
和new_df
object
,兩個數據幀之間的唯一區別是new_df
沒有列b
。 將列添加回new_df
無法解決問題。 這僅在第一列b
被刪除時發生。 如果列e
是浮點數或整數數據類型,則不會發生這種情況。
pandas==0.22.0
和pandas==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.