首页 > 解决方案 > 从 column1 动态获取值并将其分配给同一列中的 NaN 值,如果它们都具有相同的 column2 值

问题描述

我有一个看起来像这样的 DataFrame:

      ID  DESCRIPTION TYPE1 TYPE2
12345678 EXAMPLENAME1 874.4   NaN
12345678 EXAMPLENAME2 854.4   NaN
12345678 EXAMPLENAME3 874.4   B-5
78978999 EXAMPLENAME2 788.8   B-9
78978999 EXAMPLENAME4 978.2   NaN
78978999 EXAMPLENAME1 288.3   NaN
92124566 EXAMPLENAME3 369.1   NaN
92124566 EXAMPLENAME3 289.1   B-3
92124566 EXAMPLENAME3 959.1   NaN

我想获取所有TYPE2具有相同 ID 且值为 not 的列NaN。我们可以假设:

  1. 每个 ID只有TYPE2一行具有非空值。
  2. TYPE2每个 ID 都是唯一的。

最终产品应如下所示:

      ID  DESCRIPTION TYPE1 TYPE2
12345678 EXAMPLENAME1 874.4   B-5
12345678 EXAMPLENAME2 854.4   B-5
12345678 EXAMPLENAME3 874.4   B-5
78978999 EXAMPLENAME2 788.8   B-9
78978999 EXAMPLENAME4 978.2   B-9
78978999 EXAMPLENAME1 288.3   B-9
92124566 EXAMPLENAME3 369.1   B-3
92124566 EXAMPLENAME3 289.1   B-3
92124566 EXAMPLENAME3 959.1   B-3

我已经尝试过ffill,但无法建立仅当 ID 相同时才填写的条件。大约有 1,500,000 个不同的TYPE2ID值,因此手动建立它们就像df.loc[df["ID"]="12345678", "TYPE2"] = "B-5"行不通一样。

如何df.loc检查是否ID相同,然后从中获取非空值TYPE2并将其分配给其余ID行?有没有其他方法可以获得相同的结果?

标签: pythonpandas

解决方案


要在每个 ID 中填充空值,我们必须先使用.groupby然后组合.bfill().ffill()

df['TYPE2'] = df.groupby('ID')['TYPE2'].bfill().ffill()
#result
    ID          DESCRIPTION     TYPE1   TYPE2
0   12345678    EXAMPLENAME1    874.4   B-5
1   12345678    EXAMPLENAME2    854.4   B-5
2   12345678    EXAMPLENAME3    874.4   B-5
3   78978999    EXAMPLENAME2    788.8   B-9
4   78978999    EXAMPLENAME4    978.2   B-9
5   78978999    EXAMPLENAME1    288.3   B-9
6   92124566    EXAMPLENAME3    369.1   B-3
7   92124566    EXAMPLENAME3    289.1   B-3
8   92124566    EXAMPLENAME3    959.1   B-3

推荐阅读