首页 > 解决方案 > 在两个元素之间和 between() python 之间创建新列

问题描述

data_set在列表中有一个数据框和两个重要的信息

cond_list = [{'LQ','DA'},{'HJ','OP'}].

报告两个值之间的所有信息LQ and DAHJ and OP在新列“另一通行证”中以及同一天和同一 ID 中的哪个条件。

例子:

令 i, j 分别对应 LQ 和 DA 的 Rank。我<j

输入:

ID 日期 信息 堀赖 类型 笔记
1552 2020 年 1 月 4 日 1 量产 10:00 D LVM
1552 2020 年 1 月 4 日 1 量产 10:10 一个 LVM
1552 2020 年 1 月 4 日 2 洛杉矶 10:12
1552 2020 年 1 月 4 日 3 文学学士 10:15
1552 2020 年 1 月 4 日 4 10:25 一个 低压差
1552 2020 年 5 月 4 日 1 DT 11:30 D
1552 2020 年 5 月 4 日 2 GR 11:33
1552 2020 年 5 月 4 日 3 量产 11:35 D LDT
1552 2020 年 5 月 4 日 3 量产 11:38 一个
1552 2020 年 5 月 4 日 4 VT 11:40
1552 2020 年 5 月 4 日 5 一个 11:43
1552 2020 年 5 月 4 日 6 VB 11:46
1552 2020 年 5 月 4 日 7 11:55 一个 低密度脂蛋白
1552 2020 年 5 月 4 日 7 11:59 D
1552 2020 年 5 月 4 日 8 12:15 一个
1697 2020 年 15 月 4 日 1 海杰 10:00 D LVM
1697 2020 年 15 月 4 日 4 OP 11:00 一个 LVM

我过滤了一个只包含两个条件元素的值表:

mask = df.groupby(['ID', 'Date'])['Info'].agg(set).apply(lambda x: any([y.issubset(x) for y in cond_list]))
data_set = df.set_index(['ID', 'Date']).loc[mask].reset_index()
dt_final = data_set.loc[data_set['Info'].isin(cond.values.ravel())]

我获得了一个新的数据框“dt_final”:

ID 日期 信息 堀赖 类型 笔记
1552 2020 年 1 月 4 日 1 量产 10:00 D LVM
1552 2020 年 1 月 4 日 1 量产 10:10 一个 LVM
1552 2020 年 1 月 4 日 4 10:25 一个 低压差
1552 2020 年 5 月 4 日 3 量产 11:35 D LDT
1552 2020 年 5 月 4 日 3 量产 11:38 一个
1552 2020 年 5 月 4 日 7 11:55 一个 低密度脂蛋白
1552 2020 年 5 月 4 日 7 11:59 D
1697 2020 年 15 月 4 日 1 海杰 10:00 D LVM
1697 2020 年 15 月 4 日 4 OP 11:00 一个 LVM

我说一组值“等级”:

cd = dt_final.groupby(["ID", "Date"])["Rank"].agg(list).tolist()

我过滤介于两者之间的值:

for i in cd:
    pr['Another Pass'] = data_set.loc[data_set.Rank.between(i[0],i[-1])].groupby(['ID', 'Date ']).agg({'Info':list})

尽管它通过相同的日期和相同的 id 声明所有信息,而不是条件cond_list中两点之间的必需值,就像一个例子:(

标签: pythonpandasdataframe

解决方案


由于相同的 ID 和 Date 不能同时具有两组值,您可以尝试:

cond_list = [['LQ','DA'],['HJ','OP']]
firsts = [s[0] for s in cond_list]
lasts = [s[-1] for s in cond_list]

another_pass= df.groupby(["ID", "Date"])
                .apply(lambda x: x[x["Rank"].between(x[x["Info"].isin(firsts)]["Rank"].min(), 
                                                     x[x["Info"].isin(lasts)]["Rank"].max(), 
                                                     inclusive="neither")]["Info"].tolist())
                .rename("Another Pass")

>>> output

ID    Date     
1552  1/4/2020         [LA, BA]
      5/4/2020     [VT, AN, VB]
1697  15/4/2020              []

如果要将其合并回原始 DataFrame 以创建新列:

output = df.merge(another_pass, left_on = ["ID", "Date"], right_index=True)

>>> output

      ID       Date  Rank Info Horaire Type Note  Another Pass
0   1552   1/4/2020     1   LQ   10:00    D  LVM      [LA, BA]
1   1552   1/4/2020     1   LQ   10:10    A  LVM      [LA, BA]
2   1552   1/4/2020     2   LA   10:12    P  NaN      [LA, BA]
3   1552   1/4/2020     3   BA   10:15    P  NaN      [LA, BA]
4   1552   1/4/2020     4   DA   10:25    A  LVD      [LA, BA]
5   1552   5/4/2020     1   DT   11:30    D  NaN  [VT, AN, VB]
6   1552   5/4/2020     2   GR   11:33    P  NaN  [VT, AN, VB]
7   1552   5/4/2020     3   LQ   11:35    D  LDT  [VT, AN, VB]
8   1552   5/4/2020     3   LQ   11:38    A  NaN  [VT, AN, VB]
9   1552   5/4/2020     4   VT   11:40    P  NaN  [VT, AN, VB]
10  1552   5/4/2020     5   AN   11:43    P  NaN  [VT, AN, VB]
11  1552   5/4/2020     6   VB   11:46    P  NaN  [VT, AN, VB]
12  1552   5/4/2020     7   DA   11:55    A  LDF  [VT, AN, VB]
13  1552   5/4/2020     7   DA   11:59    D  NaN  [VT, AN, VB]
14  1552   5/4/2020     8   AT   12:15    A  NaN  [VT, AN, VB]
15  1697  15/4/2020     1   HJ   10:00    D  LVM            []
16  1697  15/4/2020     4   OP   11:00    A  LVM            []
编辑:

对于输出中所需的行,您可以执行以下操作:

>>> output[((output["Info"].isin(["LQ", "HJ"])) & 
            (output["Type"]=="D")) | 
           ((output["Info"].isin(["DA", "OP"])) & 
            (output["Type"]=="A"))]

      ID       Date  Rank Info Horaire Type Note  Another Pass
0   1552   1/4/2020     1   LQ   10:00    D  LVM      [LA, BA]
4   1552   1/4/2020     4   DA   10:25    A  LVD      [LA, BA]
7   1552   5/4/2020     3   LQ   11:35    D  LDT  [VT, AN, VB]
12  1552   5/4/2020     7   DA   11:55    A  LDF  [VT, AN, VB]
15  1697  15/4/2020     1   HJ   10:00    D  LVM            []
16  1697  15/4/2020     4   OP   11:00    A  LVM            []

推荐阅读