[英]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_categories
到FOO
,然后使用新添加的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.