繁体   English   中英

删除pandas groupby中的empty或nan组

[英]Remove group of empty or nan in pandas groupby

在数据框中,某些行中有一些空(NaN)值 - 下面的示例

s = pd.DataFrame([[39877380,158232151,20], [39877380,332086469,], [39877380,39877381,14], [39877380,39877383,8], [73516838,6439138,1], [73516838,6500551,], [735571896,203559638,], [735571896,282186552,], [736453090,6126187,], [673117474,12196071,], [673117474,12209800,], [673117474,618058747,6]], columns=['start','end','total'])

当我分组开始和结束列时

s.groupby(['start', 'end']).total.sum()

我得到的输出是

start      end
39877380   39877381    14.00
           39877383     8.00
           158232151   20.00
           332086469     nan
73516838   6439138      1.00
           6500551       nan
673117474  12196071      nan
           12209800      nan
           618058747    6.00
735571896  203559638     nan
           282186552     nan
736453090  6126187       nan

我想排除所有以结束为'nan'的值的开始组 - 预期输出 -

start      end
39877380   39877381    14.00
           39877383     8.00
           158232151   20.00
           332086469     nan
73516838   6439138      1.00
           6500551       nan
673117474  12196071      nan
           12209800      nan
           618058747    6.00

我尝试使用 dropna(),但它正在删除所有 nan 值而不是 nan 组。

我是python和pandas的新手。 有人可以帮助我吗? 谢谢你

在较新的min_count=1版本中,如果使用sum则必须使用min_count=1缺失值:

s1 = s.groupby(['start', 'end']).total.sum(min_count=1)
#oldier pandas version solution
#s1 = s.groupby(['start', 'end']).total.sum()

如果Series.notnaGroupBy.transformGroupBy.any至少每个第一级有一个非缺失值,则可以过滤,过滤是通过boolean indexing

s2 = s1[s1.notna().groupby(level=0).transform('any')]
#oldier pandas version solution
#s2 = s1[s1.notnull().groupby(level=0).transform('any')]
print (s2)
start      end      
39877380   39877381     14.0
           39877383      8.0
           158232151    20.0
           332086469     NaN
73516838   6439138       1.0
           6500551       NaN
673117474  12196071      NaN
           12209800      NaN
           618058747     6.0
Name: total, dtype: float64

或者可以通过MultiIndex.get_level_values获取第一级索引值的唯一值并通过DataFrame.loc过滤:

idx = s1.index.get_level_values(0)
s2 = s1.loc[idx[s1.notna()].unique()]
#oldier pandas version solution
#s2 = s1.loc[idx[s1.notnull()].unique()]
print (s2)
start      end      
39877380   39877381     14.0
           39877383      8.0
           158232151    20.0
           332086469     NaN
73516838   6439138       1.0
           6500551       NaN
673117474  12196071      NaN
           12209800      NaN
           618058747     6.0
Name: total, dtype: float64

暂无
暂无

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

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