使用两列的第一个和最后一个值,并根据条件生成新的数据帧

时间:2019-10-01 09:52:14

标签: python pandas numpy

说我有以下数据框,

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_idtype,则需要基于列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]

我试图使用捕获每个symbolsymbol_id值的第一个和最后一个值,

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

但是,我的数据框很大,symbol的唯一值超过50,000,因此在这里我需要一个更好的解决方案。

任何帮助或建议都值得赞赏!

2 个答案:

答案 0 :(得分:2)

您可以使用分组依据以及第一个和最后一个agrigate功能

df[df["type"]=="CDS"].groupby("symbol_id").agg({"start":"first", "end":"last", "symbol":"first","symbol_id":"first", "type":"first"})

答案 1 :(得分:1)

尝试:

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
  

使用@Dev Khadka使用的agg进行编辑