Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据其他列条目计算具有不同函数的新dataframe列?_Python_Pandas_Dataframe_Apply - Fatal编程技术网

Python 如何根据其他列条目计算具有不同函数的新dataframe列?

Python 如何根据其他列条目计算具有不同函数的新dataframe列?,python,pandas,dataframe,apply,Python,Pandas,Dataframe,Apply,给定这个数据帧 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

给定这个数据帧

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')
并对每个组应用不同的函数,但我仍然想知道最优雅的解决方案是什么

我创建了第二个函数(conv2),并假设您想要计算conv,如果列B等于20,则为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

这就是您想要的吗?

我创建了第二个函数(conv2),并假设您想要计算conv,如果列B等于20,则为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

这是您正在寻找的吗?

还有另一种使用
apply()
的方法,它可以占用
数据帧的多个列。下面是一个例子,所有大写字母中都有占位符:

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

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

还有另一种使用
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

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

您可以这样设置它

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

你可以这样设置

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

告诉我们你希望它如何变化以及你认为结果应该是什么。告诉我们你希望它如何变化以及你认为结果应该是什么。这是我最初的想法,但我只是不知道如何使用lambda函数设置条件。这是我最初的想法,但我只是不知道如何使用lambda函数设置条件。这很有效。我仍在学习如何使用lambda函数来处理有效的条件。我还在学习如何将lambda函数用于条件句