use*_*097 4 python nan crosstab dataframe pandas
我正在使用numpy 0.10.1和pandas 0.17.0的Python 3.4.1。我有一个大型的数据框,其中列出了单个动物的种类和性别。这是一个真实的数据集,不可避免地存在NaN表示的缺失值。数据的简化版本可以生成为:
import numpy as np
import pandas as pd
tempDF = pd.DataFrame({ 'id': [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],
'species': ["dog","dog",np.nan,"dog","dog","cat","cat","cat","dog","cat","cat","dog","dog","dog","dog",np.nan,"cat","cat","dog","dog"],
'gender': ["male","female","female","male","male","female","female",np.nan,"male","male","female","male","female","female","male","female","male","female",np.nan,"male"]})
Run Code Online (Sandbox Code Playgroud)
打印数据框将得到:
gender id species
0 male 1 dog
1 female 2 dog
2 female 3 NaN
3 male 4 dog
4 male 5 dog
5 female 6 cat
6 female 7 cat
7 NaN 8 cat
8 male 9 dog
9 male 10 cat
10 female 11 cat
11 male 12 dog
12 female 13 dog
13 female 14 dog
14 male 15 dog
15 female 16 NaN
16 male 17 cat
17 female 18 cat
18 NaN 19 dog
19 male 20 dog
Run Code Online (Sandbox Code Playgroud)
我想使用以下方法生成交叉表以显示每种物种中的雄性和雌性数量:
pd.crosstab(tempDF['species'],tempDF['gender'])
Run Code Online (Sandbox Code Playgroud)
这将产生下表:
gender female male
species
cat 4 2
dog 3 7
Run Code Online (Sandbox Code Playgroud)
这是我所期望的。但是,如果我包含margins = True选项,它将产生:
pd.crosstab(tempDF['species'],tempDF['gender'],margins=True)
gender female male All
species
cat 4 2 7
dog 3 7 11
All 9 9 20
Run Code Online (Sandbox Code Playgroud)
如您所见,边际总数似乎不正确,可能是由于数据框中的数据丢失所致。这是预期的行为吗?在我看来,这似乎很令人困惑。当然,边际总数应该是表中显示的行和列的总数,并且不包括表中未表示的任何缺失数据。包含dropna = False不会影响结果。
在创建表之前,我可以删除带有NaN的任何行,但这似乎是很多额外的工作,并且在进行分析时需要考虑很多额外的事情。我应该将其报告为错误吗?
您不是唯一经历过这种情况的人。它不仅发生在 pd.crosstab 上,还发生在 pd.pivot_table 和 DataFrame.groupby 上
在文档中,它谈到了排除 Na 的 groupby:
GroupBy 中的 NA 组将自动排除。例如,此行为与 R 一致。
您可以在这篇文章中找到一些很好的解决方案: groupby columns with NaN(missing)values
也许有一天有人会解决这个问题:https://github.com/pandas-dev/pandas/issues/10772
我想一种解决方法是在创建表之前将NaN转换为“缺少”,然后交叉插值将包括专门用于缺失值的列和行:
pd.crosstab(tempDF['species'].fillna('missing'),tempDF['gender'].fillna('missing'),margins=True)
gender female male missing All
species
cat 4 2 1 7
dog 3 7 1 11
missing 2 0 0 2
All 9 9 2 20
Run Code Online (Sandbox Code Playgroud)
就个人而言,我希望看到默认行为,因此我不必记住在每次交叉表计算中都替换所有NaN。
归档时间: |
|
查看次数: |
3274 次 |
最近记录: |