python - 在两个元素之间和 between() python 之间创建新列
问题描述
我data_set
在列表中有一个数据框和两个重要的信息
cond_list = [{'LQ','DA'},{'HJ','OP'}]
.
报告两个值之间的所有信息LQ and DA
或HJ and OP
在新列“另一通行证”中以及同一天和同一 ID 中的哪个条件。
例子:
令 i, j 分别对应 LQ 和 DA 的 Rank。我<j
ID 1552,日期 1/4/2020,我们有 Info['LQ'] 对应于 Rank = 1 和 Info['DA'] 对应于 Rank = 4 --> 所以所有信息 'Another pass' 包括 [LA, BA ] 因为等级 DA < 等级 LA,等级 BA < 等级 LQ
ID 1552,日期 5/4/2020,我们有 Info['LQ'] 对应 Rank = 3 和 Info['DA'] 对应 Rank = 7 --> 所以所有信息 'Another pass' 包括 [VT,AN ,VB] 因为 Rank DA < Rank VT, Rank AN, Rank VB < Rank LQ
ID 1697,日期 15/4/2020,我们有 Info['LQ'] 对应于 Rank = 1,Info['DA'] 对应于 Rank = 4,但这两点之间没有信息,所以“再过一遍”是空的
输入:
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中两点之间的必需值,就像一个例子:(
解决方案
由于相同的 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 []
推荐阅读
- node.js - 中间件电子邮件重复控制不良代码建模
- c# - C# WPF - ApplicationExit 调用 API
- rust - 如何在 if let 语句中写入多个条件?
- javascript - 禁用右键单击 iframe
- c# - 如何将嵌套 collectionView 的 ItemsSource 属性绑定到其中包含的 CollectionView 的项?
- python - PIL 生成图像的像素化
- ruby-on-rails - 注销帐户时未定义的方法
- google-apps-script - 如何验证 Google Script 的 PayPal webhook 签名?
- cancancan - 为什么 cancancan 方法在视图中返回错误的值,但在控制器中返回正确的值?
- fullpage.js - FullPage.js 绝对元素的“移动”位置