Python 一次使用多种fillna策略的groupby(熊猫)

Python 一次使用多种fillna策略的groupby(熊猫),python,pandas,nan,data-analysis,data-cleaning,Python,Pandas,Nan,Data Analysis,Data Cleaning,如何按一列进行分组,然后在每个组中对其他列同时应用多个fillna策略?多重含义: 如果是组中的第一个,则替换为零,然后ffill,直到到达第一个数据点 后面的NaN被封了 对于数据点之间的所有NaN,bfill 如果都是NaN,那就别打扰这群人 基本上,我有以下数据帧: A B C 0 A NaN NaN 1 A NaN NaN 2 A 1.0 10.0 3 A NaN NaN 4 B NaN NaN 5 B 2.0

如何按一列进行分组,然后在每个组中对其他列同时应用多个fillna策略?多重含义:

  • 如果是组中的第一个,则替换为零,然后ffill,直到到达第一个数据点
  • 后面的NaN被封了
  • 对于数据点之间的所有NaN,bfill
  • 如果都是NaN,那就别打扰这群人
  • 基本上,我有以下数据帧:

        A    B     C
    0   A  NaN   NaN
    1   A  NaN   NaN
    2   A  1.0  10.0
    3   A  NaN   NaN
    4   B  NaN   NaN
    5   B  2.0  20.0
    6   B  NaN  20.0
    7   B  NaN   NaN
    8   C  NaN   NaN
    9   C  NaN   NaN
    10  C  NaN   NaN
    11  C  NaN  30.0
    
    我希望它变成:

        A    B     C
    0   A    0     0
    1   A    0     0
    2   A  1.0  10.0
    3   A  1.0  10.0
    4   B    0     0
    5   B  2.0  20.0
    6   B  2.0  20.0
    7   B  2.0  20.0
    8   C  NaN     0
    9   C  NaN     0
    10  C  NaN     0
    11  C  NaN  30.0
    
    我尝试使用
    df.groupby('A').nth(1)
    获取第一个元素,并有条件地继续,但是
    groupby
    创建的新索引不是原始索引(即0,4,8),无论我是否通过
    .reset\u index()
    选项

    数据帧的代码:

    
    df=pd.DataFrame({'A':[“A”,“A”,“A”,
    “B”、“B”、“B”、“B”、“C”、“C”、“C”、“C”],
    “B”:[np.nan,np.nan,1,np.nan,
    np.nan,2,np.nan,np.nan,
    np.nan,np.nan,np.nan,np.nan],
    C:[np.nan,np.nan,10,np.nan,
    np.nan,20,20,np.nan,
    np.nan,np.nan,np.nan,30]})
    
    一个可能的想法是在
    A上使用
    ,然后使用自定义变压器功能:

    def fx(s):
        if s.isna().all():
            return s
        elif pd.isna(s.iloc[0]):
            s.iloc[0] = 0
            s = s.ffill().bfill()
        return s
    
    df[['B', 'C']] = df.groupby('A')[['B', 'C']].transform(fx)
    


    我已经不理解第一个条件“如果组中第一个,则替换为零,然后ffill,直到到达第一个数据点”。如果NaN被零取代,那没什么好抱怨的。可能有点不清楚,是真的。我指的是启动组的NaN组的
    fillna(0)
    。你能用索引4解释一下第行的输出吗?这是一个打字错误,应该是
    0
    ,我会把它编辑掉。
    # print(df)
        A    B     C
    0   A  0.0   0.0
    1   A  0.0   0.0
    2   A  1.0  10.0
    3   A  1.0  10.0
    4   B  0.0   0.0
    5   B  2.0  20.0
    6   B  2.0  20.0
    7   B  2.0  20.0
    8   C  NaN   0.0
    9   C  NaN   0.0
    10  C  NaN   0.0
    11  C  NaN  30.0