对列进行分组,然后根据空列值删除值

Grouping columns, then deleting values based on null column values

我正在重新发布,因为我的上一个问题措辞不当。我有一个如下所示的 table:

+------+------+------+------+------------+----------+
| ID 1 | ID 2 | Type | Year | Identified | Multiple |
+------+------+------+------+------------+----------+
|  100 |   10 | A    | 2018 |         12 |          |
|  100 |   11 | B    | 2019 |            | multiple |
|  100 |   12 | C    | 2019 |            | multiple |
|  100 |   13 | D    | 2019 |            |          |
|  200 |   10 | A    | 2018 |            |          |
|  200 |   11 | B    | 2019 |            | multiple |
|  200 |   12 | C    | 2019 |            | multiple |
|  200 |   13 | D    | 2019 |            |          |
+------+------+------+------+------------+----------+

我正在尝试删除 ID 组没有 Identified 值的“多个”列中的“多个”字符串。例如,第一组 ID 1 == 100 包含一个非空 Identified 值,因此我们可以保留“多个”值。但是,ID 1 == 200 组没有 Identified 值,因此我想删除出现在该组中的“多个”值,为我们提供以下数据框。

+------+------+------+------+------------+----------+
| ID 1 | ID 2 | Type | Year | Identified | Multiple |
+------+------+------+------+------------+----------+
|  100 |   10 | A    | 2018 |         12 |          |
|  100 |   11 | B    | 2019 |            | multiple |
|  100 |   12 | C    | 2019 |            | multiple |
|  100 |   13 | D    | 2019 |            |          |
|  200 |   10 | A    | 2018 |            |          |
|  200 |   11 | B    | 2019 |            |          |
|  200 |   12 | C    | 2019 |            |          |
|  200 |   13 | D    | 2019 |            |          |
+------+------+------+------+------------+----------+

如果我可以重新表述我的问题,请告诉我。

编辑:如果 IdentifiedMultiple 列均为空白,则留空。

假设您的数据框可以使用与此相同的类型构建(请注意下次如何提供示例数据框,因为无法直接复制您的数据框)

df= pd.DataFrame({
    'ID 1': [100]*4+[200]*4,
    'other_cols':range(8),
    'Identified':['12']+['']*7,
    'Multiple':['','multiple','multiple','']*2
})
print(df)
#    ID 1  other_cols  Identified  Multiple
# 0   100           0          12          
# 1   100           1              multiple
# 2   100           2              multiple
# 3   100           3                      
# 4   200           4                      
# 5   200           5              multiple
# 6   200           6              multiple
# 7   200           7                      

因此,要完成这项工作,请检查 Identified if not equal (ne) 为空白的位置。 groupby.transformany 如果一个 ID 不为空,则对所有相同的 ID 获得 True。使用此掩码的反向 (~) 到 select 只有空白的 ID,并在另一列中分配空白。

# greate a mask with True where at least one non blank value per ID
mask = df['Identified'].ne('').groupby(df['ID 1']).transform(any)

# reverse the mask and assign blank 
df.loc[~mask, 'Multiple'] = ''

print(df)
#    ID 1  other_cols  Identified  Multiple
# 0   100           0          12          
# 1   100           1              multiple
# 2   100           2              multiple
# 3   100           3                      
# 4   200           4                      
# 5   200           5                      
# 6   200           6                      
# 7   200           7