Использование первого и последнего значений двух столбцов и создание нового фрейма данных на основе условий - PullRequest
1 голос
/ 01 октября 2019

Скажем, у меня есть следующий фрейм данных,

df.head()
    ID  start    end    symbol    symbol_id    type
    1   146       291      bus    bus-201  CDS
    1   146      314      bus    bus-201  trans
    1   603       243      bus    bus-201  CDS
    1   1058      2123      car    car-203  CDS
    1   910       81      car    car-203  ex
    1   2623      2686      car    car-203  CDS
    1   5948       6043      car    car-203  CDS
    1   6348       6474      car    car-203  CDS
    1   910       81      car    car-201  ex
    1   910       81      car    car-201  ex
    1   636      650      car    car-203  CDS
    1   202      790      train    train-204  CDS
    1   200      314      train    train-204  CDS
    1   202      837      train    train-204  CDS

Теперь из вышеупомянутого фрейма данных мне нужно сгруппировать элементы по столбцу symbol_id, если столбец type равен CDS. Затем мне нужно использовать первое значение из столбца start в качестве значения в start column of the new data frame and last value from column end as the value in column end`.

Наконец, df2 должен выглядеть так:

start    end    symbol    symbol_id    type
146     243    bus        bus-203     CDS
1058    650    car        car-203     CDS
202     837    train      train-204    CDS

Я пытался использовать list значений из df['symbol'],

sym_list=df['symbol'].tolist().drop_duplicates()
    for symbol in df['symbol'].values:
        if symbol in tuple(sym_list):
           df_symbol =df['symbol'].isin(symbol)

, которые бросилиследующая ошибка,

TypeError: only list-like objects are allowed to be passed to isin(), you passed a [str]

Я пытался захватить первое и последнее значение для каждого значения symbol и symbol_id, используя,

start = df.query('type =="CDS"')[['start']].iloc[0]    
end = df.query('type =="CDS"')[['end']].iloc[-1]  

Однако мой фрейм данныхдовольно большой, и у меня есть более 50 000 уникальных значений для symbol, поэтому мне нужно лучшее решение здесь.

Любая помощь или предложения приветствуются !!

Ответы [ 2 ]

2 голосов
/ 01 октября 2019

Вы можете сделать это с помощью функции группирования по первой и последней совокупности

df[df["type"]=="CDS"].groupby("symbol_id").agg({"start":"first", "end":"last", "symbol":"first","symbol_id":"first", "type":"first"})
1 голос
/ 01 октября 2019

Попробуйте:

df_group = df[df['type']=='CDS'].groupby(['symbol_id', 'symbol', 'type'])
df_new = pd.DataFrame(columns =['start', 'end'])
df_new[['start', 'end']] = df_group.agg({'start':'first', 'end': 'last'})
df_new.reset_index()

   symbol_id    symbol  start   end type
0   bus-201      bus    146     243 CDS
1   car-203      car    1058    650 CDS
2   train-204   train   202     837 CDS

Отредактировано с помощью agg, как @Dev Khadka

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...