Как сгруппировать почти повторяющиеся значения в кадре данных панд? - PullRequest
0 голосов
/ 25 апреля 2018

Если в DataFrame есть повторяющиеся значения, панды уже предоставляют функции для замены или удаления дубликатов. С другой стороны, во многих экспериментальных наборах данных могут быть «близкие» дубликаты.

Как можно заменить эти почти повторяющиеся значения, например, их значит?

Пример данных выглядит следующим образом:

df = pd.DataFrame({'x': [1, 2,2.01, 3, 4,4.1,3.95, 5,], 
                   'y': [1, 2,2.2, 3, 4.1,4.4,4.01, 5.5]})

Я пытался взломать что-то, чтобы связать их рядом с дубликатами, но это использует для циклов и похоже на хак против панд:

def cluster_near_values(df, colname_to_cluster, bin_size=0.1):

    used_x = [] # list of values already grouped
    group_index = 0
    for search_value in df[colname_to_cluster]:

        if search_value in used_x:
            # value is already in a group, skip to next
            continue

        g_ix = df[abs(df[colname_to_cluster]-search_value) < bin_size].index
        used_x.extend(df.loc[g_ix, colname_to_cluster])
        df.loc[g_ix, 'cluster_group'] = group_index
       group_index += 1

    return df.groupby('cluster_group').mean()

Что делает группирование и усреднение:

print(cluster_near_values(df, 'x', 0.1))

                  x     y
cluster_group                
0.0            1.000000  1.00
1.0            2.005000  2.10
2.0            3.000000  3.00
3.0            4.016667  4.17
4.0            5.000000  5.50

Есть ли лучший способ добиться этого?

1 Ответ

0 голосов
/ 25 апреля 2018

Вот пример, где вы хотите сгруппировать элементы с точностью до одной цифры.Вы можете изменить это по мере необходимости.Вы также можете изменить это для значений биннинга с порогом, превышающим 1.

df.groupby(np.ceil(df['x'] * 10) // 10).mean()    
            x     y
x                  
1.0  1.000000  1.00
2.0  2.005000  2.10
3.0  3.000000  3.00
4.0  4.016667  4.17
5.0  5.000000  5.50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...