【问题标题】:Fill nan Pandas DF with N number of Column Numbers from Different DF用来自不同 DF 的 N 个列号填充 nan Pandas DF
【发布时间】:2022-08-14 23:22:24
【问题描述】:

我有一个 df \"df1\",如下所示,我需要使用 groupby \"plant_name\" 填充不同 df 中 \"n\" 列数中的值的 nan 值,如下所示。

Index   Adj_Prod    Adj_Prod    Adj_Prod    Adj_Prod    Adj_Prod    month   plant_name  year
3455    63285.13821 63285.13821 63285.13821 63285.13821 63285.13821 12  PENASCAL II     2021
3464    52758.13661 52758.13661 52758.13661 52758.13661 52758.13661 1   PENASCAL II     2022
3473    55998.67419 55998.67419 55998.67419 55998.67419 55998.67419 2   PENASCAL II     2022
3482    68582.45954 68582.45954 68582.45954 68582.45954 68582.45954 3   PENASCAL II     2022
3491    97313.92303 97313.92303 97313.92303 97313.92303 97313.92303 4   PENASCAL II     2022
3500    106054.0829 106054.0829 106054.0829 106054.0829 106054.0829 5   PENASCAL II     2022
3509    70424.47176 70424.47176 70424.47176 70424.47176 70424.47176 6   PENASCAL II     2022
3518    nan         nan         nan         nan         nan         7   PENASCAL II     2022
3527    nan         nan         nan         nan         nan         8   PENASCAL II     2022
3536    nan         nan         nan         nan         nan         9   PENASCAL II     2022
3545    nan         nan         nan         nan         nan        10   PENASCAL II     2022
3554    nan         nan         nan         nan         nan        11   PENASCAL II     2022
3563    nan         nan         nan         nan         nan        12   PENASCAL II     2022

这是另一个数据框 \"df2\",我需要使用它来填充需要按 \"plant_name\" 分组的 nan 值,但我不确定如何通过可能更改的列号来执行此操作 - 在在这个例子中,有 5 列,如下所示:

Index   month   plant_name  0       1           2           3           4
46      11  PENASCAL I  57024.37    85799.06    56423.82    44967.31    62426.29
47      12  PENASCAL I  72072.84    61719.23    74177.79    53048.06    61513.94
48       7  PENASCAL II 56188.81    64556.23    74918.13    72951.01    57474.33
49       8  PENASCAL II 31309.33    38571.34    61658.58    38578.86    52948.55
50       9  PENASCAL II 29783.46    39220.07    38641.02    35055.39    33024.38
51      10  PENASCAL II 65961.29    38898.14    55066.84    30100.4     65961.29
52      11  PENASCAL II 55134.4     49616.31    50353.2     48451.29    51903.16
53      12  PENASCAL II 62738.47    61756.62    60691.09    54747.75    48753.57

最终结果应如下所示:

        Adj_Prod    Adj_Prod    Adj_Prod    Adj_Prod    Adj_Prod    month   plant_name  year
3455    63285.13821 63285.13821 63285.13821 63285.13821 63285.13821 12      PENASCAL II 2021
3464    52758.13661 52758.13661 52758.13661 52758.13661 52758.13661 1       PENASCAL II 2022
3473    55998.67419 55998.67419 55998.67419 55998.67419 55998.67419 2       PENASCAL II 2022
3482    68582.45954 68582.45954 68582.45954 68582.45954 68582.45954 3       PENASCAL II 2022
3491    97313.92303 97313.92303 97313.92303 97313.92303 97313.92303 4       PENASCAL II 2022
3500    106054.0829 106054.0829 106054.0829 106054.0829 106054.0829 5       PENASCAL II 2022
3509    70424.47176 70424.47176 70424.47176 70424.47176 70424.47176 6       PENASCAL II 2022
3518    56188.81    64556.23    74918.13    72951.01    57474.33    7       PENASCAL II 2022
3527    31309.33    38571.34    61658.58    38578.86    52948.55    8       PENASCAL II 2022
3536    29783.46    39220.07    38641.02    35055.39    33024.38    9       PENASCAL II 2022
3545    65961.29    38898.14    55066.84    30100.4     65961.29    10      PENASCAL II 2022
3554    55134.4     49616.31    50353.2     48451.29    51903.16    11      PENASCAL II 2022
3563    62738.47    61756.62    60691.09    54747.75    48753.57    12      PENASCAL II 2022

我认为 groupby \"plant_name\" 然后使用列号的值会起作用,但我不确定如何做到这一点,因为列号会根据 \"n\" 的值而改变,即 5在这个例子中。谢谢你!

我已经尝试过这样的事情,但不知道如何指定列以及如何处理例如 500 列 0、1、...500。

df1.fillna(df2.groupby([\'plant_name\'])[\'0\',\'1\',\'2\',\'3\',\'4\']. 

这给了我一个错误:

KeyError: \"Columns not found: \'2\', \'3\', \'1\', \'0\', \'4\'\"

我也试过这个但不起作用:

df1.fillna(df2.groupby([\'plant_name\'])[list(range(5))]))

此外,这不起作用:

df1.groupby([\'plant_name\'])[\'Adj_Prod\'].fillna(df2.iloc[:,2:6])

    标签: pandas group-by nan autofill


    【解决方案1】:

    使用您提供的数据框,我建议采用不同的方法:

    # Rename df1 columns so as to be unique
    df1.columns = [
        col if not col.startswith("Adj") else f"Adj_Prod{i}"
        for i, col in enumerate(df1.columns)
    ]
    
    # Rename df2 columns to match df1 columns names
    df2.columns = [col if not col.isnumeric() else f"Adj_Prod{col}" for col in df2.columns]
    
    
    # Concat non nan rows of df1 with matching of rows
    # of df2 (modified to use df1 nan rows index and year column values)
    df = pd.concat(
        [
            df1.dropna(
                how="all", subset=[col for col in df1.columns if col.startswith("Adj")]
            ),
            df2[
                (df2["month"].isin(df1["month"]))
                & (df2["plant_name"].isin(df1["plant_name"]))
            ]
            .set_index(df1[df1.isna().any(axis=1)].index)
            .assign(year=df1.loc[df1.isna().any(axis=1), "year"]),
        ]
    )
    
    # Rename df columns to be identical
    df.columns = [col if not col.startswith("Adj") else "Adj_Prod" for col in df.columns]
    
    print(df)
    # Output
              Adj_Prod     Adj_Prod     Adj_Prod     Adj_Prod     Adj_Prod  month   plant_name  year
    Index
    3455   63285.13821  63285.13821  63285.13821  63285.13821  63285.13821     12  PENASCAL II  2021
    3464   52758.13661  52758.13661  52758.13661  52758.13661  52758.13661      1  PENASCAL II  2022
    3473   55998.67419  55998.67419  55998.67419  55998.67419  55998.67419      2  PENASCAL II  2022
    3482   68582.45954  68582.45954  68582.45954  68582.45954  68582.45954      3  PENASCAL II  2022
    3491   97313.92303  97313.92303  97313.92303  97313.92303  97313.92303      4  PENASCAL II  2022
    3500   106054.0829  106054.0829  106054.0829  106054.0829  106054.0829      5  PENASCAL II  2022
    3509   70424.47176  70424.47176  70424.47176  70424.47176  70424.47176      6  PENASCAL II  2022
    3518      56188.81     64556.23     74918.13     72951.01     57474.33      7  PENASCAL II  2022
    3527      31309.33     38571.34     61658.58     38578.86     52948.55      8  PENASCAL II  2022
    3536      29783.46     39220.07     38641.02     35055.39     33024.38      9  PENASCAL II  2022
    3545      65961.29     38898.14     55066.84      30100.4     65961.29     10  PENASCAL II  2022
    3554       55134.4     49616.31      50353.2     48451.29     51903.16     11  PENASCAL II  2022
    3563      62738.47     61756.62     60691.09     54747.75     48753.57     12  PENASCAL II  2022
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      • 2022-07-20
      • 2018-04-04
      • 2020-09-16
      • 2020-08-16
      • 2021-11-08
      • 1970-01-01
      相关资源
      最近更新 更多