【问题标题】:Drop rows on multiple conditions (based on 2 column) in pandas dataframe在 pandas 数据框中删除多个条件下的行(基于 2 列)
【发布时间】:2020-10-19 23:32:04
【问题描述】:

我有一个包含 200 万条记录的 pandas 数据框。 (DA1、DA2等2列) 如果我根据 DA1 值对数据框进行排序,则如下所示。我的真实数据框有 200 万条记录。

df
    DA1   DA2
0   1.0   1.0
1   1.0   11256.0
2   1.0   131248.0
3   2.0   2.0
4   2.0   11585.0
5   2.0   25894.0
6   3.0   3.0

如果我根据 DA2 值对数据框进行排序,如下所示。

df.head(6)
        DA1         DA2
0       1.0         1.0
87472   11256.0     1.0
267142  131248.0    1.0
3       2.0         2.0
568875  11585.5     2.0
598253  25894.0     2.0
652875  365845.0    2.0

如果有任何行正在翻转并且在另一行中,我想删除该行。我的意思是如果 DA1 2.0 和 DA2 365845.0 以及另一行 DA1 365845.0 和 DA2 2.0 我想删除其中的一个。

我基本上想删除索引 87472、267142、568875 和 598253 中的这些重复值。 下面的行基本上要掉了。

        DA1         DA2
87472   11256.0     1.0
267142  131248.0    1.0
568875  11585.5     2.0
598253  25894.0     2.0

我可以在 for 循环或 lambda 函数中执行此操作吗? **他们中的大多数与上述数据框混淆。这是我真正想做的一个简单的例子。如果任何行翻转并具有相同的值,我想删除它。 DA1 1 和 DA2 2 另一行 DA1 2 和 DA2 1 我想放弃它。 **。

df = pd.DataFrame({"Column1":[1, 1,1, 3,2],
                    "Column2":[1,2,3,1,1]})

df
    Column1     Column2
0       1           1
1       1           2
2       1           3
3       3           1
4       2           1

# I basically need to delete 3, 4 indexes since those values already in 1,2 indexes
I need this data frame
df
    Column1     Column2
0       1           1
1       1           2
2       1           3

提前致谢。

【问题讨论】:

  • 为什么要保留索引 652875?
  • 这些只是您要删除的索引吗?你想放弃更多。
  • @DavidErickson 因为它不是 2.0 365845.0 格式。如果任何行正在翻转并且在另一行中,我想删除该行。我的意思是如果 2.0 365845.0 和 365845.0 2.0 我想放弃一个。
  • @Grayrigel 有很多重复项我想删除很多索引

标签: python pandas for-loop lambda


【解决方案1】:

考虑到两列的组合,需要一些工程才能找到重复的行。您可以创建一个Series 对象来显示重复的行:

key=df.apply(lambda x: '{}-{}'.format(min(x), max(x)), axis=1)

这基本上将为每一行创建一个键,每列中的有序值由破折号分隔。然后您可以使用此键删除重复的行:

df[~key.duplicated()]

例子:

>>> df = pd.DataFrame({'a': [1, 2, 3, 4, 5], 'b': [2, 1, 4, 3, 5]})
>>> df

Output: 

   a  b
0  1  2
1  2  1
2  3  4
3  4  3
4  5  5

>>> key=df.apply(lambda x: '{}-{}'.format(min(x), max(x)), axis=1)
>>> key

Output:

0    1-2
1    1-2
2    3-4
3    3-4
4    5-5
dtype: object

>>> df[~key.duplicated()]

Output:

   a  b
0  1  2
2  3  4
4  5  5

【讨论】:

    【解决方案2】:

    排序后

    df = df.drop_duplicates('DA2')
    

    【讨论】:

    • 但它会删除索引 - 652875 365845.0 2.0。我想保留这一行。有什么建议吗?
    猜你喜欢
    • 2018-10-17
    • 1970-01-01
    • 2022-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 2020-05-18
    • 2022-06-10
    • 1970-01-01
    相关资源
    最近更新 更多