如何根据其他列条目计算具有不同功能的新Pandas数据帧列?

时间:2017-04-25 00:42:19

标签: 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(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')并为每个组应用不同的功能,但我仍然想知道什么是最优雅的解决方案。

3 个答案:

答案 0 :(得分:0)

我创建了第二个函数(conv2)并假设你想要计算转换,如果列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

这是你在找什么?

答案 1 :(得分:0)

还有另一种使用r'\d{2,3}-\d{9,11}' 的方法可以占用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部分指示pandas按列应用函数(默认为行式)。

答案 2 :(得分:0)

你可以这样设置

ul, li {
    display:inline;
    margin-top: 300px;
    line-height: 10px;
    padding-left: 80px;
    padding-top: 10px;
    padding-bottom: 10px;
    padding-right: 66px;
    font-size: 18px;
    width: 100%;
    background-color: #216064;

}