【问题标题】:Dropping duplicate rows based on column value by using the nearly equal criteria in pandas使用 pandas 中几乎相等的条件根据列值删除重复行
【发布时间】:2019-02-16 00:51:26
【问题描述】:

我有一个 pandas 数据框,它包含一些重复的行,所以我想删除它们,但有一个条件:

        wave  num  stlines     fwhm       EWs  MeasredWave        rv
0    4050.32    3  0.28269  0.07365  22.16080  4050.311360  0.639507
1    4208.98    5  0.48122  0.08765  44.90035  4208.972962  0.501295
2    4208.98    6  0.49994  0.08220  43.74591  4208.974061  0.423016
3    4512.99    2  0.19428  0.09145  18.91216  4512.981301  0.577864
4    4512.99    2  0.21029  0.08860  19.83386  4512.981389  0.572018
5    4520.22    7  0.65300  0.11791  81.95775  4520.214169  0.386727
6    4520.22    4  0.66772  0.11591  82.38548  4520.212833  0.475334
7    4523.08    6  0.13789  0.11303  16.59034  4523.060226  1.310633
8    4523.40    1  0.41672  0.09892  43.87775  4523.390305  0.642545
9    5797.87    3  0.27062  0.15473  44.57125  5797.850820  0.991747
10   5797.87    4  0.28240  0.14991  45.06534  5797.848945  1.088698

dir1 = os.listdir('/home/Desktop/computed_2d/')
for filename in dir1:
    if filename.endswith('.ares'):
       df1 = pd.read_table(path1+filename, skiprows=0, usecols=(0,1,2,3,4,8,10),names=['wave','num','stlines','fwhm','EWs','MeasredWave','rv'],delimiter=r'\s+')

       #dup_rows gives the duplicate rows on the basis of column 'wave'
       dup_rows = df1[df1.duplicated(['wave'], keep=False)]

       computed_rv = 0.50641

现在我想做的是,我想删除 df1.rv 的值几乎等于 computed_rv 的值的重复行。

例如:从第 1 行和第 2 行开始,我想保留第 1 行,因为 df1.rv 的值几乎等于 compted_rv

这些值可能低于或高于computed_rv,例如(0.34 和 0.30)或(0.99 和 1.8),然后我想保留 df1.rv 的值接近 'computed_rv' 的行,就像这里我会想要保留 0.34 和 0.99 的那些

我该怎么做?

【问题讨论】:

    标签: python-2.7 pandas dataframe duplicates


    【解决方案1】:

    IIUC:

    query

    computed_rv = 0.50641
    tol = 0.01
    
    df1.query('abs(rv - @computed_rv) < @tol')
    
          wave  num  stlines     fwhm       EWs  MeasredWave        rv
    1  4208.98    5  0.48122  0.08765  44.90035  4208.972962  0.501295
    

    is_close

    computed_rv = 0.50641
    tol = 0.01
    
    df1[np.isclose(df1.rv, computed_rv, atol=tol)]
    
          wave  num  stlines     fwhm       EWs  MeasredWave        rv
    1  4208.98    5  0.48122  0.08765  44.90035  4208.972962  0.501295
    

    熊猫

    computed_rv = 0.50641
    tol = 0.01
    
    df1[df1.rv.sub(computed_rv).abs().lt(tol)]
    
          wave  num  stlines     fwhm       EWs  MeasredWave        rv
    1  4208.98    5  0.48122  0.08765  44.90035  4208.972962  0.501295
    

    【讨论】:

    • 第一步没看懂?你能解释一下每一步发生了什么吗??
    • 这是三种不同的方法。 不是三个步骤。您可以选择其中任何一个来完成相同的任务。
    • 我用的是熊猫,它给了我一个空的数据框?我现在做错了什么?
    • 您需要适当地设置您的容差tol
    • 是的,它工作,谢谢。!有一些行,如第 9,10 行,其中 'df1.rv' 的值与 'computed_rv' 有点远,所以这里它正在删除它们。但是我想保留其值或多或少等于 'computed_rv' 的那个,例如,这里是第 9 行。我该怎么做?
    【解决方案2】:

    您可以修复 rv 应匹配多少的阈值并排除与特定条件不匹配的行,这里我使用 10% 的增量和减量来计算 rv 的“rv”列

    computed_rv = 0.50641
    threshold =  0.1*computed_rv
    df[(df.rv.ge(computed_rv-threshold) & df.rv.le(computed_rv+threshold))]
    

    输出:

        wave    num stlines fwhm    EWs MeasredWave rv
    1   4208.98 5   0.48122 0.08765 44.90035    4208.972962 0.501295
    6   4520.22 4   0.66772 0.11591 82.38548    4520.212833 0.475334
    

    【讨论】:

    • 我只想删除 16 行,但它几乎删除了所有行??我想通过在列'rv'上应用几乎相等的标准来删除列'wave'的重复行
    • 哈哈,您可以降低阈值,现在我将 0.1*computed_rv 设置为 10 % ,您可以将值降低到 0.03(3%) 或任何相关值以方便您使用 :-)跨度>
    猜你喜欢
    • 2016-07-16
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    相关资源
    最近更新 更多