请考虑以下数据框:
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
和object
中,列df
的数据类型均为new_df
,两个数据帧之间的唯一区别是new_df
没有列{ {1}}。将列重新添加到b
不能解决问题。这仅在删除第一列new_df
时发生。如果列b
是浮点型或整数数据类型,则不会发生这种情况。
e
和pandas==0.22.0
中都存在此行为
现在有一个open GitHub issue供任何人尝试解决!
答案 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
不会更改,因为该错误与第一个位置的非数字列触发强制仅数字计算的方式有关。我看不到没有在熊猫代码库中进行修复的任何修复方法。或者确保第一列将始终成功进行中值计算。