Skip to main content
 首页 » 编程设计

python之如何在同一列中用组的最小值填充 NaN 值

2025年05月04日2052php

如何使用组的最小值在同一列中填充 NaN 值 - 请参见下面的 df 和 df2。对于“A”列中的类别“2”,我想要 min(20, 15)...请帮忙:)

import pandas as pd   
import numpy as np 
 
 
df = pd.DataFrame({"A": [1,1,2,2,2,3,3,3,3,4,4],  
               "B": [ np.nan , 10, np.nan, 20, 15, np.nan,np.nan,np.nan,np.nan,40, np.nan]}) 
 
In[1]: df 
Out[1]:  
    A     B 
0   1   NaN 
1   1  10.0 
2   2   NaN 
3   2  20.0 
4   2  15.0 
5   3   NaN 
6   3   NaN 
7   3   NaN 
8   3   NaN 
9   4  40.0 
10  4   NaN 

如何在没有循环的情况下获得 df2 - ?

df2 = pd.DataFrame({"A": [1,1,2,2,2,3,3,3,3,4,4],  
               "B": [ 10 , 10, 15, 15, 15, np.nan,np.nan,np.nan,np.nan,40, 40]}) 
 
In[1]: df2 
Out[18]:  
A     B 
0   1  10.0 
1   1  10.0 
2   2  15.0 
3   2  15.0 
4   2  15.0 
5   3   NaN 
6   3   NaN 
7   3   NaN 
8   3   NaN 
9   4  40.0 
10  4  40.0 

请您参考如下方法:

如果想用 min 替换每组的所有值,请使用 GroupBy.transform :

df['B'] = df.groupby('A')['B'].transform('min') 
print (df) 
    A     B 
0   1  10.0 
1   1  10.0 
2   2  15.0 
3   2  15.0 
4   2  15.0 
5   3   NaN 
6   3   NaN 
7   3   NaN 
8   3   NaN 
9   4  40.0 
10  4  40.0 

如果只想将 NaN 替换为 min,请添加 fillna或使用自定义 lambda 函数:

df['B'] = df.B.fillna(df.groupby('A')['B'].transform('min')) 

备选方案:

df['B'] = df.groupby('A')['B'].transform(lambda x: x.fillna(x.min())) 
 
print (df) 
    A     B 
0   1  10.0 
1   1  10.0 
2   2  15.0 
3   2  20.0 
4   2  15.0 
5   3   NaN 
6   3   NaN 
7   3   NaN 
8   3   NaN 
9   4  40.0 
10  4  40.0