对列进行分组,然后根据空列值删除值
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 | | |
+------+------+------+------+------------+----------+
如果我可以重新表述我的问题,请告诉我。
编辑:如果 Identified
和 Multiple
列均为空白,则留空。
假设您的数据框可以使用与此相同的类型构建(请注意下次如何提供示例数据框,因为无法直接复制您的数据框)
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.transform
和 any
如果一个 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
我正在重新发布,因为我的上一个问题措辞不当。我有一个如下所示的 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 | | |
+------+------+------+------+------------+----------+
如果我可以重新表述我的问题,请告诉我。
编辑:如果 Identified
和 Multiple
列均为空白,则留空。
假设您的数据框可以使用与此相同的类型构建(请注意下次如何提供示例数据框,因为无法直接复制您的数据框)
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.transform
和 any
如果一个 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