【问题标题】:How to create new column based on an equation and unique values from other column?如何根据等式和其他列的唯一值创建新列?
【发布时间】:2020-09-17 20:48:07
【问题描述】:

想象一下,我有一个像下面这样的数据框。我想创建一个新列 df['b'],其中包含一个特定方程,该方程采用 df['a'] 的最大值和最小值。方程应该是这样的:

import pandas as pd
df = pd.DataFrame({'a':[0.3, 0.1, 0.7, 0.5, 0.4, 0.3, 0.1, 0.6, 0.8, 0.2, 0.2],
                   'group':[1, 1, 3, 3, 5, 5, 3, 3, 6, 6, 1]})

equation = (df['a'] - df['a'].min()) / (df['a'].max() - df['a'].min())

虽然,这些最大值和最小值应该与 df['group'] 中的唯一值相关。因此,我们应该得到第 1、3、5 和 6 组的最大值和最小值,然后将方程应用于 df['a'] 的相关行。

我设法将这些值分开,但我不知道如何重现这个想法。

a_max = df.groupby('group')['a'].max()
a_min = df.groupby('group')['a'].min()

输出应如下所示:

     a     group   b
0   0.3      1     1
1   0.1      1     0
2   0.7      3     1
3   0.5      3     0.67
4   0.4      5     1
5   0.3      5     0
6   0.1      3     0
7   0.6      3     0.6
8   0.8      6     1
9   0.2      6     0
10  0.2      1     0.5

【问题讨论】:

    标签: python pandas group-by unique


    【解决方案1】:

    我们可以按组预先计算最大值/最小值:

    groups = df.groupby('group')['a']
    amax, amin = groups.transform('max'), groups.transform('min')
    
    df['b'] = (df['a']-amin)/(amax-amin)
    

    或者使用自定义函数:

    df['b'] = df.groupby('group')['a'].apply(lambda x: (x-x.min())/(x.max()-x.min()) )
    

    第一种方法性能略高,而第二种方法在代码方面更短。

    两者都会输出:

          a  group         b
    0   0.3      1  1.000000
    1   0.1      1  0.000000
    2   0.7      3  1.000000
    3   0.5      3  0.666667
    4   0.4      5  1.000000
    5   0.3      5  0.000000
    6   0.1      3  0.000000
    7   0.6      3  0.833333
    8   0.8      6  1.000000
    9   0.2      6  0.000000
    10  0.2      1  0.500000
    

    【讨论】:

    • 那是完美的,我的朋友。非常感谢。
    • 也许 np.ptp ~ :-)
    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 2023-01-12
    相关资源
    最近更新 更多