pandas - 过滤和添加 NaN 值行
问题描述
我有一个看起来像这样的数据框:
Country Year Value
USA 1991 22
USA 1992 3
USA 1993 10
China 1991 1
China 1993 15
Argentina 1991 6
Argentina 1992 4
我需要一个函数来查找每个国家/地区的缺失年份,并在数据框中添加一行带有 NaN 值的行。
Country Year Value
USA 1991 22
USA 1992 3
USA 1993 10
China 1991 1
China 1992 NaN
China 1993 15
Argentina 1991 6
Argentina 1992 4
Argentina 1993 NaN
我还需要创建一个数据框,其值仅基于我拥有所有国家/地区的值的年份。
Country Year Value
USA 1991 22
China 1991 1
Argentina 1991 6
解决方案
DataFrame.set_index
与MultiIndex.from_product
for一起使用DataFrame.reindex
:
df = df.set_index(['Country','Year'])
mux = pd.MultiIndex.from_product(df.index.levels, names=df.index.names)
df = df.reindex(mux).reset_index()
print (df)
Country Year Value
0 Argentina 1991 6.0
1 Argentina 1992 4.0
2 Argentina 1993 NaN
3 China 1991 1.0
4 China 1992 NaN
5 China 1993 15.0
6 USA 1991 22.0
7 USA 1992 3.0
8 USA 1993 10.0
对于没有缺失值的组:
vals = df1.loc[df1['Value'].isna(), 'Country'].unique()
df2 = df1[~df1['Country'].isin(vals)]
print (df2)
Country Year Value
6 USA 1991 22.0
7 USA 1992 3.0
8 USA 1993 10.0
替代方法是DataFrame.unstack
使用DataFrame.stack
:
s = df.set_index(['Country','Year']).unstack()
df1 = s.stack(dropna=False).reset_index()
print (df1)
Country Year Value
0 Argentina 1991 6.0
1 Argentina 1992 4.0
2 Argentina 1993 NaN
3 China 1991 1.0
4 China 1992 NaN
5 China 1993 15.0
6 USA 1991 22.0
7 USA 1992 3.0
8 USA 1993 10.0
对于每列的所有值,请使用DataFrame.dropna
:
df2 = s.dropna(axis=1).stack().reset_index()
print (df2)
Country Year Value
0 Argentina 1991 6.0
1 China 1991 1.0
2 USA 1991 22.0
编辑:
如果得到:
ValueError:无法处理非唯一的多索引!
Country
这意味着和Year
列没有唯一的组合:
print (df)
Country Year Value
0 USA 1991 22 <-duplicate USA, 1991
1 USA 1991 3 <-duplicate USA, 1991
2 USA 1993 10
3 China 1991 1
4 China 1993 15
5 Argentina 1991 6
6 Argentina 1992 4
解决方案是set_index
通过groupby
一些聚合函数来改变,比如mean
,sum
对于独特的组合:
df = df.groupby(['Country','Year']).mean()
mux = pd.MultiIndex.from_product(df.index.levels, names=df.index.names)
df = df.reindex(mux).reset_index()
print (df)
Country Year Value
0 Argentina 1991 6.0
1 Argentina 1992 4.0
2 Argentina 1993 NaN
3 China 1991 1.0
4 China 1992 NaN
5 China 1993 15.0
6 USA 1991 12.5
7 USA 1992 NaN
8 USA 1993 10.0
推荐阅读
- excel - 产品价格和规格的网络抓取
- haskell - 将类型级别参数分配给数据结构树
- java - Android 应用程序在新的 Intent 上不断崩溃
- java - 如何在 Java 中使用 Optional?
- c# - ASP.NET MVC FileContentResult 内联 PDF 文件名未显示在浏览器标题中
- android - 获取设备的蓝牙 MAC 地址
- c++ - std::stoi 只转换前几个字符
- jquery - Symfony - 使用模态强制在 jquery 脚本中获取 POST 请求?
- react-native - TouchableOpacity 在 ScrollView 中不起作用
- r - 对角线条目为 0 且所有其他条目为 0 和 1 的随机矩阵