python - 从 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
。我们可以假设:
- 每个 ID只有
TYPE2
一行具有非空值。 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 个不同的TYPE2
和ID
值,因此手动建立它们就像df.loc[df["ID"]="12345678", "TYPE2"] = "B-5"
行不通一样。
如何df.loc
检查是否ID
相同,然后从中获取非空值TYPE2
并将其分配给其余ID
行?有没有其他方法可以获得相同的结果?
解决方案
要在每个 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
推荐阅读
- c++ - 根据数据包类型改变行为,避免使用 switch 语句
- node.js - HTTP 请求,带有自定义 tcp 套接字
- powerbi - 如何从 power bi 中删除聚合值
- java - 如何打印数组的单个指定元素?
- azure - Azure AKS - 集群处于故障状态,没有任何故障
- cplex - 是否可以在不转换模型的情况下使用 CPLEX-Engine 解决 CP 公式化问题?
- java - 如何使用 For 循环来减少以下代码中的行数?
- java - 使用 Jersey 和 Jetty 在独立 Java 应用程序中以编程方式配置码头工作管理器
- python - 在 Pandas 中,如何根据另一行中的另一列值更新一行中的列值
- python - 从数据框中提取负值和正值唯一值?