Python 2.7根据另一个groupby设置groupby数据帧

时间:2018-01-05 10:04:07

标签: python pandas

我有2个groupby数据帧(AUS_2016和df_pitLaps,两者都按驱动程序ID分组),它们具有相同的列(' lap'),我正在尝试将AUS_2016子集化,使其不包含值每个驱动程序的df_pitLaps中的lap列。

简单来说,我想为每个车手的特定比赛过滤掉pitlaps(持续进站的圈数)

我得到一个按照驱动程序ID分组的True值数据框,但我不知道下一步该怎么做。

AUS_2016:

enter image description here

df_pitLaps:

enter image description here

def clean_laps_no_pitlaps(data):
    """Filters out the pit laps."""
    df_pitLaps = df_pitStops.loc[df_pitStops['raceId'].isin(data['raceId'])]
    df_pitLaps.groupby("driverId")["lap"]
    data = data.groupby("driverId")["lap"]

    nopitlaps = lambda x: (
        [(lap != pitlap) for pitlap, lap in itertools.izip(x, data)])

    no_pitlaps_in_data = pd.DataFrame(data.apply(nopitlaps))

    return no_pitlaps_in_data

调用该函数:

clean_laps_no_pitlaps(AUS_2016)

这会出现此错误:

  

DeprecationWarning:elementwise!=比较失败;这会提高   将来会出错。

以下数据框。我不知道如何继续从这里继续只为每个驱动程序过滤圈是真的(不是坑圈)。

enter image description here

解决方案:

我设法通过使用另一个不需要groupby的方法来解决它。我" vlooked-up"带有凹坑的圈到df,然后排除这些行。

def no_pitlaps(df, df_pitLaps):
    """Returns a dataframe that excludes the pit laps of each driver"""

    data_pitlaps_mapped = pd.merge(df, df_pitLaps[['driverId', 'stop', 'lap']], how='left',
        left_on=['driverId','lap'], right_on=['driverId','lap'])

    return data_pitlaps_mapped.loc[~data_pitlaps_mapped.index.isin(data_pitlaps_mapped.dropna(subset = ['stop']).index)] 

1 个答案:

答案 0 :(得分:0)

如果您只想排除AUS_2016df_pitLaps中显示的所有圈数,只需完成以下操作:

AUS_2016[~AUS_2016['lap'].isin(df_pitLaps['lap'].unique())]