【问题标题】:How to remove rows from pandas dataframe that contain combinations of the first two columns如何从包含前两列组合的熊猫数据框中删除行
【发布时间】:2019-11-14 13:58:07
【问题描述】:

我正在尝试删除包含 pandas 数据框中前两列元素组合的行,例如,在下一个 df 中:

     event1    event2    uccs   ulags
0  327423.0  329243.0  0.1663 -0.6013
1  327423.0  329589.0  0.1911 -0.4730
2  329243.0  327423.0  0.1663  0.6013
3  329243.0  329589.0  0.3101 -0.7502
4  329589.0  327423.0  0.1911  0.4730
5  329589.0  329243.0  0.3101  0.7502

第 0 行和第 2 行表示元素的组合:event1 和 event2。那就是:

0  327423.0  329243.0
2  329243.0  327423.0

一般来说,我需要将矩阵或 df 减少到 3 行,删除所有重复项。

我尝试了下一个但没有成功:

 u = df.filter(like='event1').values
 m = pd.DataFrame(np.sort(u, axis=1)).duplicated()

这样做我得到:

    event1    event2    uccs   ulags
0  327423.0  329243.0  0.1663 -0.6013
2  329243.0  327423.0  0.1663  0.6013
4  329589.0  327423.0  0.1911  0.4730

但是,如您所见,第 0 行和第 2 行是重复的。任何有关如何在 pandas 或 numpy 中执行此操作的提示将不胜感激。

【问题讨论】:

    标签: python-3.x pandas numpy numpy-ndarray matrix-indexing


    【解决方案1】:

    如果我理解正确,您已经非常接近了,您只需将布尔数组传回您的数据框以获取 boolean indexing

    df[~pd.DataFrame(np.sort(df.filter(like='event'), axis=1)).duplicated()]
    
         event1    event2    uccs   ulags
    0  327423.0  329243.0  0.1663 -0.6013
    1  327423.0  329589.0  0.1911 -0.4730
    3  329243.0  329589.0  0.3101 -0.7502
    

    注意我使用的 ~ 是逆运算符或 not 运算符:

    m = pd.DataFrame(np.sort(df.filter(like='event'), axis=1)).duplicated()
    
    print(m)
    
    0    False
    1    False
    2     True
    3    False
    4     True
    5     True
    dtype: bool
    

    现在反转:

    print(~m)
    
    0     True
    1     True
    2    False
    3     True
    4    False
    5    False
    dtype: bool
    

    【讨论】:

    • 非常感谢二凡。这解决了我的问题。我很感激!
    • 很高兴我能帮上忙。为了您的方便,添加了一个小而重要的解释。 @echaves
    • 不错的答案 (-:
    • 来自 pirsquared 先生的赞美,我受宠若惊,谢谢@piRSquared 先生
    猜你喜欢
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 2019-06-19
    • 2023-01-28
    • 2013-04-30
    • 2017-09-27
    • 1970-01-01
    相关资源
    最近更新 更多