Удалить столбцы с подстрокой, аналогичной другим столбцам Python - PullRequest
0 голосов
/ 02 августа 2020

У меня есть dataframe, где имена столбцов имеют тот же формат: data_sensor, где дата в формате yymmdd. Вот его подмножество: введите описание изображения здесь

Учитывая последние данные (180722), я хотел бы сохранить столбец в соответствии с предварительно определенным приоритетом датчика. Например, я хотел бы определить, что SN1 важнее, чем SK3. Таким образом, желаемый результат будет таким же dataframe, только без столбца 180722_SK3. Количество столбцов с одинаковой последней датой может быть больше двух.

Это решение, которое я реализовал:

sensorsImportance = ['SN1', 'SK3'] #list of importence, first item is the most important
sensorsOrdering = {word: i for i, word in enumerate(sensorsImportance)}


def remove_duplicate_last_date(df,sensorsOrdering):
    s = []
    lastDate = df.columns.tolist()[-1].split('_')[0]
    for i in df.columns.tolist():
        if lastDate in i:
            s.append(i.split('_')[1])

    if len(s)>1: 
        keepCol = lastDate +'_'+sorted(s, key=sensorsOrdering.get)[0]
        dropCols = [lastDate +'_'+i for i in sorted(s, key=sensorsOrdering.get)[1:]]
        df.drop(dropCols,axis=1,inplace=True)
        
    return df

Оно работает нормально, однако я считаю, что это слишком громоздко , есть способ лучше?

1 Ответ

0 голосов
/ 02 августа 2020

Это можно сделать, используя split столбец, затем примените argsort к списку, затем измените порядок вашего фрейма данных и снова присоедините столбцы после groupby, чтобы получить первое значение по дате

df.columns=df.columns.str.split('_').map(tuple)
sensorsImportance = ['SN1', 'SK3']
idx=df.columns.get_level_values(1).map(dict(zip(sensorsImportance,range(len(sensorsImportance))))).argsort()
df=df.iloc[:,idx].T.groupby(level=0).head(1).T
df.columns=df.columns.map('_'.join)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...