我想创建一个基于组和阈值的列,以便从另一个列中为每一组分组列截断。在
数据帧如下:
df_in ->
unique_id myvalue identif
0 CTA15 19.0 TOP
1 CTA15 22.0 TOP
2 CTA15 28.0 TOP
3 CTA15 18.0 TOP
4 CTA15 22.4 TOP
5 AC007 2.0 TOP
6 AC007 2.3 SDME
7 AC007 2.0 SDME
8 AC007 5.0 SDME
9 AC007 3.0 SDME
10 AC007 31.4 SDME
11 AC007 4.4 SDME
12 CGT6 9.7 BTME
13 CGT6 44.5 BTME
14 TVF5 6.7 BTME
15 TVF5 9.1 BTME
16 TVF5 10.0 BTME
17 BGD1 1.0 BTME
18 BGD1 1.6 NON
19 GHB 51.0 NON
20 GHB 54.0 NON
21 GHB 4.7 NON
因此,我根据“identif”列的每组创建了一个字典:
^{pr2}$因此,我的目标是根据以下条件创建一个新列,比如“chk”:
如果“identif”列与字典“md”中的键匹配,并且该键的值大于等于“myvalue”列中的相应值,则 我要1,否则为0。在
但是,我试图找到一种使用map/groupby/apply创建新输出数据帧的好方法。我现在做的是一种非常低效的方法(对百万行的实际数据需要相当长的时间) 使用如下函数:
def myfilter(df, idCol, valCol, mydict):
for index,row in df.iterrows():
for key, value in mydict.items():
if row[idCol] == key and row[valCol] >= value:
df['chk'] = 1
elif row[idCol] == key and row[valCol] < value:
df['chk'] = 0
return df
通过以下调用获取输出:
df_out = myfilter(df_in, 'identif', 'myvalue', md)
所以我的输出将是:
df_out ->
unique_id myvalue identif chk
0 CTA15 19.0 TOP 0
1 CTA15 22.0 TOP 1
2 CTA15 28.0 TOP 1
3 CTA15 18.0 TOP 0
4 CTA15 22.4 TOP 1
5 AC007 2.0 TOP 0
6 AC007 2.3 SDME 0
7 AC007 2.0 SDME 0
8 AC007 5.0 SDME 0
9 AC007 3.0 SDME 0
10 AC007 31.4 SDME 1
11 AC007 4.4 SDME 0
12 CGT6 9.7 BTME 0
13 CGT6 44.5 BTME 1
14 TVF5 6.7 BTME 0
15 TVF5 9.1 BTME 0
16 TVF5 10.0 BTME 0
17 BGD1 1.0 BTME 0
18 BGD1 1.6 NON 0
19 GHB 51.0 NON 1
20 GHB 54.0 NON 1
21 GHB 4.7 NON 0
这是工作,但效率极低,希望有一个更好的方法来做。在
这应该更快:
这个小例子的时间安排:
^{pr2}$您的版本计时:
虽然就这么一个小例子来说还不是决定性的。在
首先,遍历数据集总共四次,对于数据帧中的每一行,遍历字典中的每个元素。您可以更改函数来遍历它一次。这将加快你原来的功能。尝试类似于:
相关问题 更多 >
编程相关推荐