2016-02-16 145 views
3

我對熊貓很陌生,對此很陌生,特別是與列表和使用列表解析相比。Python Pandas:基於其他列添加列

我有一個有4列的數據框。我想根據第4列「m」創建第5列「c」。我可以通過爲列「m」中的每一行應用我的函數來獲得「c」的值。

如果「M」是一個列表,並使用列表理解這將是

c = [myfunction(x) for x in m] 

我怎麼申請這一「邏輯」的數據幀?

+0

試試這個:** DF [ 'C'] = DF [ 'M']申請(myfunction的)** –

+0

如果你確實需要應用功能分別到每一行,它將是'df ['c'] = df ['m'] .map(myfunction)'。但通常情況下這並不是最好的方法,因爲它不利用熊貓的矢量化操作,因爲大量操作可以很快地應用到整個列中。如果您可以在帖子中包含更多詳細信息,人們可以讓您知道實現此目標的最佳方式。 – Marius

回答

4

您可以assign - 樣品從doc

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'A': range(1, 11), 'B': np.random.randn(10)}) 
print df 
    A   B 
0 1 0.769028 
1 2 -0.392471 
2 3 0.153051 
3 4 -0.379848 
4 5 -0.665426 
5 6 0.880684 
6 7 1.126381 
7 8 -0.559828 
8 9 0.862935 
9 10 -0.909402 

df = df.assign(ln_A = lambda x: np.log(x.A)) 
print df 
    A   B  ln_A 
0 1 0.769028 0.000000 
1 2 -0.392471 0.693147 
2 3 0.153051 1.098612 
3 4 -0.379848 1.386294 
4 5 -0.665426 1.609438 
5 6 0.880684 1.791759 
6 7 1.126381 1.945910 
7 8 -0.559828 2.079442 
8 9 0.862935 2.197225 
9 10 -0.909402 2.302585 

或者applyLu Qi評論。

有時lambda功能是有幫助的:

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'A': range(1, 11), 'B': np.random.randn(10)}) 

df['ln_A'] = df['A'].apply(np.log) 
df['round'] = df['B'].apply(lambda x: np.round(x, 2)) 
print df 

    A   B  ln_A round 
0 1 -0.982828 0.000000 -0.98 
1 2 2.306111 0.693147 2.31 
2 3 0.967858 1.098612 0.97 
3 4 -0.286280 1.386294 -0.29 
4 5 -2.026937 1.609438 -2.03 
5 6 0.061735 1.791759 0.06 
6 7 -0.506620 1.945910 -0.51 
7 8 -0.309438 2.079442 -0.31 
8 9 -1.261842 2.197225 -1.26 
9 10 1.079921 2.302585 1.08 
0

由於熊貓是在numpy的頂部。您可以輕鬆地將功能應用於numpy.array。以下示例可能會有所幫助。您可以將列表(或列)轉移到numpy.array,然後進行矢量計算。

import numpy as np 
import pandas as pd 
data = pd.DataFrame([[1,2],[3,4]],columns=['a','b']) 
def square(x): 
    return x ** 2 
data['c'] = square(np.array(data.a)) 
+1

我覺得比較好用的是data ['c'] = data ['a']。apply(square)' – jezrael