2017-04-25 56 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 
相關問題