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

标签 python pandas dataframe

如何使用组的最小值在同一列中填充 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

关于python - 如何在同一列中用组的最小值填充 NaN 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48879913/

相关文章:

python - 在 Django 中使用多个数据库,只有一张表 "django_migrations"

python - 检查字符串是否包含特定字符

python - Pandas:匹配具有不同索引的两个数据帧

python - 索引数据框

python - DataFrame 对象在计算长度时不可调用

python - 试图从 python 中的正则表达式匹配中打印一个组

Python:在套接字监听连接时显示消息 'Waiting for player...'

python - 如何将 pandas DataFrame 导出到 Microsoft Access?

python - 如何比较具有不同索引的两个数据帧并打印出重复的行?

R - 总结其他两个因子水平的每个组合的因子水平