【问题标题】:How to calculate new Pandas dataframe column with different functions according to other column entries?如何根据其他列条目计算具有不同功能的新 Pandas 数据框列?
【发布时间】:2017-04-25 00:42:18
【问题描述】:

给定这个数据框

df=pd.DataFrame({"A":[0.380,0.475,0.380,0.475,0.570],"B":[20,20,63,63,63]})

       A     B
0    0.380   20
1    0.475   20
2    0.380   63
3    0.475   63
4    0.570   63

我想添加一个列,该列在给定 A 列的输入的情况下返回函数的结果,但该函数应根据 B 列的内容而有所不同。使用 apply 方法添加基于 A 的列很容易:

def conv(x):
    return (33.8*np.sin(1.65*(x-0.89))+33.9)/0.19
df['C']=df['A'].apply(conv)
df

但我想根据 B 列中的条目对 A 应用完全不同的函数。在定义中设置任何“if”语句当然会返回 ValueErrors,使用 df['C'].isin([20]) 会给我一个布尔值列表价值观。接下来我将尝试df.groupby('B') 并对每个组应用不同的功能,但我仍然想知道什么是最优雅的解决方案。

【问题讨论】:

  • 告诉我们您希望它如何变化以及您认为结果应该是什么。

标签: python pandas dataframe apply


【解决方案1】:

还有另一种使用apply() 的方法可以占用DataFrame 的多个列。下面是一个示例,占位符全部大写:

def conv(x, y):
    if y == SOME_VALUE_1:
        return (33.8*np.sin(1.65*(x-0.89))+33.9)/0.19
    else:
        return SOME_OTHER_FUNCTION_OF_X

df['C']=df.apply(lambda x : conv(x['A'], x['B']) , axis=1)
df

请注意我们是如何将函数直接应用于DataFrame,而不是仅应用于其中的一列。 lambda 挑选出正确的列并将它们发送到函数。 axis=1 部分指示 pandas 逐列应用函数(默认为逐行)。

【讨论】:

  • 这是我最初的想法,但我只是不知道如何使用 lambda 函数设置条件。
【解决方案2】:

我创建了第二个函数 (conv2),并假设如果 B 列等于 20,则您要计算 conv,否则为 conv2。我得到以下信息:

df = pd.DataFrame({"A": [0.380, 0.475, 0.380, 0.475, 0.570], "B": [20, 20, 63, 63, 63]})


def conv(x):
    return (33.8*np.sin(1.65*(x-0.89))+33.9)/0.19


def conv2(x):
    return 2.0 * x

df['C'] = df.apply(lambda x: conv(x.A) if (x.B == 20) else conv2(x.A), axis=1)

我得到以下数据框:

       A   B          C
0  0.380  20  45.775003
1  0.475  20  65.906299
2  0.380  63   0.760000
3  0.475  63   0.950000
4  0.570  63   1.140000

这是你要找的吗?

【讨论】:

  • 那行得通。我仍在学习如何将 lambda 函数用于条件
【解决方案3】:

你可以这样设置

df = pd.DataFrame(dict(
        A=np.arange(8),
        B=list('wxyz') * 2
    ))

dof = dict(
    w=lambda j: j + 2,
    x=lambda j: j ** 2 - 1,
    y=lambda j: math.sin(j),
    z=lambda j: abs(math.log2(j))
)

df.apply(lambda x: dof[x.B](x.A), 1)

0     2.000000
1     0.000000
2     0.909297
3     1.584963
4     6.000000
5    24.000000
6    -0.279415
7     2.807355
dtype: float64

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 2018-10-11
    • 2020-10-02
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    相关资源
    最近更新 更多