Skip to main content
 首页 » 编程设计

python之如何从 "remembering"旧值停止 Dataframe 子集

2025年05月04日10www_RR

很抱歉措辞怪异,但我不知道如何更好地描述它。我会将我的问题翻译成美国术语以便于理解。我的问题是,我有一个包含州和地区的国家数据库,我只需要处理来自佛罗里达州的地区,所以我这样做:

df_fl=df.loc[df.state=='florida'].copy() 

经过一些转换后,我想取佛罗里达州每个地区的平均值,所以我这样做:

df_final=df_fl.groupby(['district']).mean() 

但这带来了数据库中每个地区的数据框。来自不在佛罗里达州的地区的所有行都充满了 nans。我想对此有一个简单的解决方案,但我一直找不到。它也是这样工作的,这有点违反直觉。

那么,你能帮我解决这个问题吗?

提前致谢

编辑: 我的数据是这样的:

District   state      Salary 
   1        Florida    1000 
   1        Florida    2000 
   2        Florida    2000 
   2        Florida    3000 
   3        California 3000 

df_fl,那么,看起来像这样:

District   state      Salary 
   1        Florida    1000 
   1        Florida    2000 
   2        Florida    2000 
   2        Florida    3000 

申请后

df_final=df_fl.groupby(['district']).mean() 

我希望得到这个:

District   Salary 
   1        1500 
   2        2500 

但是我得到了这个:

District   Salary 
   1        1500 
   2        2500 
   3         nan 

显然是一个非常简化的版本,但核心仍然存在。

请您参考如下方法:

这是因为您的 'District' 列是分类类型。

MCVE

df = pd.DataFrame(dict( 
    State=list('CCCCFFFF'), 
    District=list('WXWXYYZZ'), 
    Value=range(1, 9) 
)) 

没有分类

df.query('State == "F"').groupby('District').Value.mean() 
 
District 
Y    5.5 
Z    7.5 
Name: Value, dtype: float64 

带有分类

df.assign( 
    District=pd.Categorical(df.District) 
).query('State == "F"').groupby('District').Value.mean() 
 
District 
W    NaN 
X    NaN 
Y    5.5 
Z    7.5 
Name: Value, dtype: float64 

解决方案

有很多方法可以做到这一点。保留分类类型的一种方法是使用方法 remove_unused_categories

df = df.assign(District=df.District.cat.remove_unused_categories())