根据现有条件删除 DataFrame 行
Drop DataFrame Row Based on Existing Condition
给定以下 pandas df
-
Holding Account
Account Type
Column A
Column B
Rupert 06 (23938996)
Holding Account
1825973
1702598
Rupert 07 (23938996)
Holding Account
1697870
1825973
-
-
-
-
Caroline 06 (0131465)
Holding Account
11112222
5435450
Caroline 07 (0131465)
Holding Account
7896545
11112222
我一直在努力寻找一种方法来执行以下操作 -
- 第 1 步 - 对于整个
df
,搜索出现在 A 列中的 B 列值的实例
(示例:Caroline 07
的 B 列 == Caroline 06
)
- 第 2 步 - 满足上述条件的行应将 B 列值更改为其匹配行的 B 列值
(示例:Caroline 7
B 列值将更改从 11112222
到 5435450
这意味着 pandas df
现在看起来如下 -
Holding Account
Account Type
Column A
Column B
Rupert 06 (23938996)
Holding Account
1825973
1702598
Rupert 07 (23938996)
Holding Account
1697870
1702598
-
-
-
-
Caroline 06 (0131465)
Holding Account
11112222
5435450
Caroline 07 (0131465)
Holding Account
7896545
5435450
代码实现:下面的代码实现步骤1和2 -
import numpy as np
df['Column B'] = np.where(df['Column B'].isin(df['Column A'].values),df['Column B'].shift(),df['Column B'])
我需要帮助的地方:我想扩展代码,包括以下内容:
- 第 3 步 - 删除列 A 值与另一行的列 B 匹配的行,一旦第 2 步完成
(例如:Rupert 06 (23938996)
和 Caroline 06 (0131465)
将被删除,因为他们收到来自 Rupert 07 (23938996)
和 Caroline 07 (0131465)
. 的 B 列值
Holding Account
Account Type
Column A
Column B
Rupert 07 (23938996)
Holding Account
1697870
1702598
Caroline 07 (0131465)
Holding Account
7896545
5435450
有谁知道如何适当扩展代码?
不使用 np.where
,只需计算一些掩码:
rows_to_remove = df['Column A'].isin(df['Column B'])
df.loc[df['Column B'].isin(df['Column A'].values), 'Column B'] = df.loc[rows_to_remove, 'Column B'].to_numpy()
df = df[~rows_to_remove]
输出:
>>> df
Holding Account Account Type Column A Column B
1 Rupert 07 (23938996) Holding Account 1697870 1702598
3 Caroline 07 (0131465) Holding Account 7896545 5435450
给定以下 pandas df
-
Holding Account | Account Type | Column A | Column B |
---|---|---|---|
Rupert 06 (23938996) | Holding Account | 1825973 | 1702598 |
Rupert 07 (23938996) | Holding Account | 1697870 | 1825973 |
- | - | - | - |
Caroline 06 (0131465) | Holding Account | 11112222 | 5435450 |
Caroline 07 (0131465) | Holding Account | 7896545 | 11112222 |
我一直在努力寻找一种方法来执行以下操作 -
- 第 1 步 - 对于整个
df
,搜索出现在 A 列中的 B 列值的实例
(示例:Caroline 07
的 B 列 ==Caroline 06
) - 第 2 步 - 满足上述条件的行应将 B 列值更改为其匹配行的 B 列值
(示例:Caroline 7
B 列值将更改从11112222
到5435450
这意味着 pandas df
现在看起来如下 -
Holding Account | Account Type | Column A | Column B |
---|---|---|---|
Rupert 06 (23938996) | Holding Account | 1825973 | 1702598 |
Rupert 07 (23938996) | Holding Account | 1697870 | 1702598 |
- | - | - | - |
Caroline 06 (0131465) | Holding Account | 11112222 | 5435450 |
Caroline 07 (0131465) | Holding Account | 7896545 | 5435450 |
代码实现:下面的代码实现步骤1和2 -
import numpy as np
df['Column B'] = np.where(df['Column B'].isin(df['Column A'].values),df['Column B'].shift(),df['Column B'])
我需要帮助的地方:我想扩展代码,包括以下内容:
- 第 3 步 - 删除列 A 值与另一行的列 B 匹配的行,一旦第 2 步完成
(例如:Rupert 06 (23938996)
和Caroline 06 (0131465)
将被删除,因为他们收到来自Rupert 07 (23938996)
和Caroline 07 (0131465)
. 的 B 列值
Holding Account | Account Type | Column A | Column B |
---|---|---|---|
Rupert 07 (23938996) | Holding Account | 1697870 | 1702598 |
Caroline 07 (0131465) | Holding Account | 7896545 | 5435450 |
有谁知道如何适当扩展代码?
不使用 np.where
,只需计算一些掩码:
rows_to_remove = df['Column A'].isin(df['Column B'])
df.loc[df['Column B'].isin(df['Column A'].values), 'Column B'] = df.loc[rows_to_remove, 'Column B'].to_numpy()
df = df[~rows_to_remove]
输出:
>>> df
Holding Account Account Type Column A Column B
1 Rupert 07 (23938996) Holding Account 1697870 1702598
3 Caroline 07 (0131465) Holding Account 7896545 5435450