Удаление дублирующихся строк на основе значения столбца с использованием почти одинаковых критериев в пандах - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть пандасный фрейм данных, и он содержит несколько повторяющихся строк, поэтому я хочу удалить их, но с условием:

        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

Как я могу это сделать ??

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Вы можете установить порог того, насколько 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
0 голосов
/ 11 сентября 2018

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
...