熊猫行为中位数的奇怪行为

时间:2019-02-18 21:06:21

标签: python pandas dataframe

请考虑以下数据框:

       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

eobject中,列df的数据类型均为new_df,两个数据帧之间的唯一区别是new_df没有列{ {1}}。将列重新添加到b不能解决问题。这仅在删除第一列new_df时发生。如果列b是浮点型或整数数据类型,则不会发生这种情况。

epandas==0.22.0中都存在此行为

现在有一个open GitHub issue供任何人尝试解决!

1 个答案:

答案 0 :(得分:3)

这似乎是一个错误。当我们将任何df调度到median时,这将映射到内部_reduce函数。将numeric_only设置为None时,它将按序列计算中位数,并忽略失败(对于c列,例如中位数计算将失败。)并累积结果(请参见{{1 }},请参阅pandas源代码core / frame.py)。到目前为止还可以。但是,当通过它一起搜索结果时,会进行检查以推断结果是标量还是序列(对于_reduce,它当然是标量)。要进行此检查,它始终使用第一列(请参阅pandas源core / apply.py中的median)。因此,如果第一列calc失败并且被跳过,则此检查失败,并引发异常。这样会在wrap_results内触发回退方法,该方法将数据框强制为仅数字(用_reduce删除任何列)并重新计算中位数。

因此,在您的情况下,如果列c(或中位数计算将失败的任何其他dtype,如文本)位于第一列中,则所有带有NaN的列也将被删除以获取中位数结果。设置NaN不会更改,因为该错误与第一个位置的非数字列触发强制仅数字计算的方式有关。我看不到没有在熊猫代码库中进行修复的任何修复方法。或者确保第一列将始终成功进行中值计算。