Pandas 如何将函数应用于 groupby().first()

威廉

我有一个 df,代码是:

  df = """
      ValOption  RB test contrat
    0       SLA  4  3    23
    1       AC   5  4    12
    2       SLA  5  5    23
    3       AC   2  4    39
    4       SLA  5  5    26
    5       AC   3  4    52
    6       SLA  4  3    64
    0       SLA  4  3    23
    1       AC   5  4    12
    2       SLA  5  5    23
    3       AC   2  4    39
    4       SLA  5  5    26
    5       AC   5  4    52
    6       SLA  4  3    64
  
    """
df = pd.read_csv(StringIO(df.strip()), sep='\s+')

输出:

       ValOption  RB  test  contrat

    0       SLA   4     3       23
    1        AC   5     4       12
    2       SLA   5     5       23
    3        AC   2     4       39
    4       SLA   5     5       26
    5        AC   3     4       52
    6       SLA   4     3       64
    0       SLA   4     3       23
    1        AC   5     4       12
    2       SLA   5     5       23
    3        AC   2     4       39
    4       SLA   5     5       26
    5        AC   5     4       52
    6       SLA   4     3       64

现在我将它分组并通过以下方式获得第一个:

df_u=df.groupby(['RB','test']).first()

输出:

在此处输入图片说明

然后我想对每一行应用一个函数,出于某种原因我必须使用 pd.apply() 函数:

def func(row):
    v1=row['RB']*3
    v2=row['test']-1
    return v1+v2

df_u['new_col']=df_u.apply(lambda row:func(row), axis=1)

注意:在实际业务中,该函数非常复杂且冗长,所以我需要使用 pd.apply()

然后我得到一个错误:

KeyError: ('RB', 'occurred at index (2, 4)')
科拉连

您必须reset_index访问“RB”和“test”行。使用.values来设定值new_col

df_u['new_col'] = df_u.reset_index().apply(func, axis=1).values
print(df_u)

# Output:
        ValOption  contrat  new_col
RB test                            
2  4           AC       39        9
3  4           AC       52       12
4  3          SLA       23       14
5  4           AC       12       18
   5          SLA       23       19

更新

如何将new_col 返回到原来的df?

df = df.merge(df.drop_duplicates(['RB', 'test'])
                .assign(new_col=func)[['RB', 'test', 'new_col']],
              on=['RB', 'test'], how='left')

# Output
   ValOption  RB  test  contrat  new_col
0        SLA   4     3       23       14
1         AC   5     4       12       18
2        SLA   5     5       23       19
3         AC   2     4       39        9
4        SLA   5     5       26       19
5         AC   3     4       52       12
6        SLA   4     3       64       14
7        SLA   4     3       23       14
8         AC   5     4       12       18
9        SLA   5     5       23       19
10        AC   2     4       39        9
11       SLA   5     5       26       19
12        AC   5     4       52       18
13       SLA   4     3       64       14

更新2

我 drop_duplicates 的原因是为了节省时间,让它更快,因为行的长度是 60k,如果我申请每一行,它会花费很多时间,而不是如果我先删除重复的,我不需要申请每个行,我直接赋值给同列值行

Apply 类似于 for 循环,使用矢量化:

df['new_col'] = (df['RB']*3) + (df['test']-1)

表现

对于 140,000 条记录,上述操作耗时 361 µs:

%timeit (df1['RB']*3) + (df1['test']-1)
361 µs ± 9.02 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

对于 14 条记录(这不是错误),之前的操作花费了 935 µs:

%timeit df.drop_duplicates(['RB', 'test']).apply(func, axis=1)
935 µs ± 5.44 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将*多个*函数应用于pandas groupby apply?

如何将 Pandas GroupBy 的发现应用于源数据

如何使用groupby将多个函数应用于Pandas中的多个列?

将功能应用于Pandas Groupby

如何将格式应用于groupby函数?

将函数应用于pandas groupby 数据框中的所有列

使用 GroupBy 沿分组变量的方向将函数应用于 Pandas

将具有多个参数的函数应用于pandas groupby对象

将加权平均函数应用于pandas groupby对象中的列,但权重总和为零

如何将自定义滚动功能应用于pandas groupby?

将ewm功能应用于Pandas groupby

将pandas groupby的结果应用于多行

将排名应用于Pandas Groupby中的每个组

如何使用pandas Groupby将不同的聚合函数应用于同一列

如何将函数应用于依赖多个列的groupby子组?

如何将groupBy和聚合函数应用于PySpark DataFrame中的特定窗口?

Pandas:如何将接受数组的函数应用于列?

如何将lambda函数应用于满足PANDAS中条件的行

如何将聚合函数应用于Pandas中数据透视表的所有列

如何将类内的函数应用于pandas Dataframe

如何将引用几列的函数应用于pandas数据框?

如何将函数应用于 Pandas 中的多个多索引列?

如何将函数应用于多列以在 Pandas 中创建多列?

如何将方法应用于Pandas数据框

创建一个剥离$的函数,转换为float并应用于pandas groupby

如何将正则表达式应用于 Pandas 中的列以查找值,然后对其应用函数?

pandas groupby将相同的功能应用于多列

pyspark相当于pandas groupby +应用于列

Pandas Complex GroupBy 并应用于机器学习数据集