【问题标题】:How to fill a np.nan column in a group based on a value in another column?如何根据另一列中的值填充组中的 np.nan 列?
【发布时间】:2021-06-04 03:05:00
【问题描述】:

我有一个数据框的子集,我需要使用基于另一列的分组和条件来回填。

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

基本上,对于一部分产品,我需要根据存在的日期回填值。例如:product 1A 我需要用aa 填写value,因为它们的日期都是2020-05-09。

我还需要在数据集的子集上执行此操作,并在此操作完成后将其与其余数据重新连接。

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

任何帮助将不胜感激?!

【问题讨论】:

    标签: python pandas group-by


    【解决方案1】:

    让我们试试transform

    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
    

    【讨论】:

      【解决方案2】:

      通过groupby()ffill() 尝试:

      df['value']=df.groupby(['dates','product'])['value'].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
      

      【讨论】:

        【解决方案3】:

        你可以把 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   
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-26
          • 2020-02-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-16
          相关资源
          最近更新 更多