2017-04-25 58 views
0

鉴于这种数据帧如何根据其他列条目计算具有不同功能的新熊猫数据框列?

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列简易的含量足以增加使用该方法适用于基于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.设置任何“如果”的定义中的语句返回ValueErrors进入一个完全不同的功能,以适用于当然,并且使用df['C'].isin([20])给了我一个布尔值列表。接下来,我将尝试df.groupby('B')并为每个组应用不同的功能,但我仍然在想什么是最优雅的解决方案。

+1

告诉我们您希望如何改变,哪些是你认为结果应该是。 – piRSquared

回答

0

我创建了第二个函数(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 

难道你要找的东西?

+0

工作。我仍然在学习如何使用lambda函数作为条件 – CAB

0

还有另一种使用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指示大熊猫按列方式应用该功能(默认为逐行)。

+0

这是我最初的想法,但我只是不知道如何使用lambda函数设置条件。 – CAB

0

你可以将它设置这样

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 
相关问题