繁体   English   中英

在 pandas.crosstab() 中显示缺失 (NA) 值

[英]Show missing (NA) values in pandas.crosstab()

我有缺失值(实际上是pandas.NA )。 问题是在使用pandas.crosstab()时没有显示它们。 我可以提供一个解决方法,并想知道这种方法是否可行,或者是否有更好的方法。

这不是pandas.crosstab 中缺失数据的副本,但可能相关。 还有一些可能相关的错误报告。 但我不确定他们是否讨论了同样的问题,因为我在那里的示例中找不到<NA>值。 也许有人可以估计我的问题是否与错误有关。

原始数据...

   YEAR  FOO
0  2001    B
1  2001    B
2  2002    A
3  2000  NaN

...导致此交叉表缺少 `NA:

YEAR  2000  2001  2002  All
FOO
A        0     0     1    1
B        0     2     0    2
All      1     2     1    4

我希望

YEAR  2000  2001  2002  All
FOO
A        0     0     1    1
B        0     2     0    2
<NA>     1     0     0    1
All      1     2     1    4

这是产生问题的MWE

#!/usr/bin/env python3
import pandas as pd

data = {'YEAR': [2001, 2001, 2002, 2000],
        'FOO': ['B', 'B', 'A', pd.NA]}

df = pd.DataFrame(data)
df.FOO = df.FOO.astype('category')
print(df)
tab = pd.crosstab(df.FOO, df.YEAR, margins=True, dropna=False)
print(tab)

我的解决方法是将缺失值视为正常值并进行一些转换。

# Workaround
df.FOO = df.FOO.astype('string')
df.FOO = df.FOO.fillna('')  # you could "use" missing also
df.FOO = df.FOO.astype('category')
print(df)

tab = pd.crosstab(df.FOO, df.YEAR, margins=True, dropna=False)
print(tab)

给出 output:

   YEAR FOO
0  2001   B
1  2001   B
2  2002   A
3  2000

YEAR  2000  2001  2002  All
FOO
         1     0     0    1
A        0     0     1    1
B        0     2     0    2
All      1     2     1    4

编辑:问题出现了为什么我使用该列作为category 答案是,在执行read_csv()时,我默认将通过dtypes=的列视为category 这很重要,因为在使用具有数百万行的 CSV 文件时,性能和 memory 的使用情况。 所以最初我总是有一个category列。

一种选择是将add_categoriesFOO ,然后使用新添加的NaN表示形式fillna

df['FOO'] = df['FOO'].cat.add_categories(['<NA>']).fillna('<NA>')
tab = pd.crosstab(df['FOO'], df['YEAR'], margins=True)

tab

YEAR  2000  2001  2002  All
FOO                        
A        0     0     1    1
B        0     2     0    2
<NA>     1     0     0    1
All      1     2     1    4

为什么要将其转换为类别。

import pandas as pd
data = {'YEAR': [2001, 2001, 2002, 2000],
        'FOO': ['B', 'B', 'A', pd.NA]}
df = pd.DataFrame(data)
print(df)
df["FOO"].fillna("NA",inplace=True)
tab=pd.crosstab(df.FOO,df.YEAR,margins=True)
print(tab)

我会简单地使用fillna将 NA 替换为字符串

tab = pd.crosstab(df['FOO'].fillna('NA'), df['YEAR'], margins=True)

标签:

YEAR  2000  2001  2002  All
FOO                        
A        0     0     1    1
B        0     2     0    2
NA       1     0     0    1
All      1     2     1    4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM