Python 如何根据另一列中的值填充组中的np.nan列?

Python 如何根据另一列中的值填充组中的np.nan列?,python,pandas,group-by,Python,Pandas,Group By,我需要使用分组和基于另一列的条件来回填数据帧的子集 data = [ ["1A", "aa", "2020-05-09"], ["1A", np.nan, "2020-05-09"], ["1A", "ab", "2020-05-10"], ["2A", "bb",

我需要使用分组和基于另一列的条件来回填数据帧的子集

data = [
    ["1A", "aa", "2020-05-09"],
    ["1A", np.nan, "2020-05-09"],
    ["1A", "ab", "2020-05-10"],
    ["2A", "bb", "2020-05-09"],
    ["2A", np.nan, "2020-05-09"],
    ["2A", "bc", "2020-05-10"],
]

df = pd.DataFrame(data, columns=["product", "value", "dates"])
df
本质上,对于产品的子集,我需要基于当前日期回填值。例如:对于
产品
1A,我需要用
aa
填写
,因为它们都有日期2020-05-09

我还需要在数据集的一个子集上执行此操作,并在完成此操作后将其与其余数据连接起来

我尝试使用带有lambda函数(ffill或bfill)的groupby,但这不起作用,因为我确实需要根据条件填充值


任何帮助都将不胜感激

让我们试试变换

df.value.fillna(df.groupby(['dates','product'])['value'].transform('first'),inplace=True)
df
  product value       dates
0      1A    aa  2020-05-09
1      1A    aa  2020-05-09
2      1A    ab  2020-05-10
3      2A    bb  2020-05-09
4      2A    bb  2020-05-09
5      2A    bc  2020-05-10

让我们试试变换

df.value.fillna(df.groupby(['dates','product'])['value'].transform('first'),inplace=True)
df
  product value       dates
0      1A    aa  2020-05-09
1      1A    aa  2020-05-09
2      1A    ab  2020-05-10
3      2A    bb  2020-05-09
4      2A    bb  2020-05-09
5      2A    bc  2020-05-10

你可以放弃na,然后加入原始df

df = df.set_index(['product','dates']) 
df.join(df.dropna(), how='left', lsuffix="_drop").loc[:,['value']].reset_index() 

  product       dates value                                                                                             
0      1A  2020-05-09    aa                                                                                             
1      1A  2020-05-09    aa                                                                                             
2      1A  2020-05-10    ab                                                                                             
3      2A  2020-05-09    bb                                                                                             
4      2A  2020-05-09    bb                                                                                             
5      2A  2020-05-10    bc   

你可以放弃na,然后加入原始df

df = df.set_index(['product','dates']) 
df.join(df.dropna(), how='left', lsuffix="_drop").loc[:,['value']].reset_index() 

  product       dates value                                                                                             
0      1A  2020-05-09    aa                                                                                             
1      1A  2020-05-09    aa                                                                                             
2      1A  2020-05-10    ab                                                                                             
3      2A  2020-05-09    bb                                                                                             
4      2A  2020-05-09    bb                                                                                             
5      2A  2020-05-10    bc   
尝试通过
groupby()
ffill()

df的输出

    product     value   dates
0   1A          aa      2020-05-09
1   1A          aa      2020-05-09
2   1A          ab      2020-05-10
3   2A          bb      2020-05-09
4   2A          bb      2020-05-09
5   2A          bc      2020-05-10
尝试通过
groupby()
ffill()

df的输出

    product     value   dates
0   1A          aa      2020-05-09
1   1A          aa      2020-05-09
2   1A          ab      2020-05-10
3   2A          bb      2020-05-09
4   2A          bb      2020-05-09
5   2A          bc      2020-05-10