2013-08-12 108 views
3

嗨,我想知道使用pandas在python中對列進行操作的最佳方法。列上的python熊貓操作

我有一個經典的數據庫,我已經加載了一個數據框,而且我經常需要對每行進行操作,如果列中標記爲'A'的值大於x,則將該值替換爲列C 「減列‘d’

現在我做這樣的事情

for i in len(df.index): 
    if df.ix[i,'A'] > x : 
     df.ix[i,'A'] = df.ix[i,'C'] - df.ix[i, 'D'] 

我想知道是否有做這幾樣操作的一個更簡單的方法,更重要的是最有效的,因爲我有大型數據庫

我試過了wi在R或Stata中,我被建議使用「a.any」或「a.all」,但我沒有在這裏或在熊貓文檔中找到任何東西。

提前致謝。

+0

的代碼有一個錯誤:LEN(df.index)返回不能被迭代的整數。 它將正確做 我在範圍內(0,len(df.index)) 按順序迭代數據幀 –

回答

5

您可以對DataFrame的.loc.ix屬性使用布爾值掩碼。

mask = df['A'] > 2 
df.ix[mask, 'A'] = df.ix[mask, 'C'] - df.ix[mask, 'D'] 

如果你有很多分支的事情,那麼你可以這樣做:

def func(row): 
    if row['A'] > 0: 
     return row['B'] + row['C'] 
    elif row['B'] < 0: 
     return row['D'] + row['A'] 
    else: 
     return row['A'] 

df['A'] = df.apply(func, axis=1) 

apply一般應比for循環快很多。

+0

其實我有幾個條件:if df。['A'] == 999;如果df ['A'] <999和df ['B'] == 999等等......我不確定這個布爾值是如何擴展的 –

+0

你提供的這個例子是:'(df ['A'] == 999)&(df ['B'] == 999)',但是如果你有一個帶有else語句的分支,你應該沿着asix使用'apply'。 –

+0

更新了示例。 –

0

有很多方法可以做到這一點,但這裏是我覺得最容易閱讀的模式。

#Assume df is a Panda's dataframe object 
idx = df.loc[:, 'A'] > x 
df.loc[idx, 'A'] = df.loc[idx, 'C'] - df.loc[idx, 'D'] 

設置小於x的元素是一樣容易df.loc [〜IDX, 'A'] = 0

2

根據我簡單。

from random import randint, randrange, uniform 
    import pandas as pd 
    import numpy as np 

    df =  pd.DataFrame({'a':randrange(0,10),'b':randrange(10,20),'c':np.random.randn(10)}) 

    #If colC > 0,5, then ColC = ColB - Cola 
    df['c'][df['c'] > 0.5] = df['b'] - df['a'] 

經過測試,它的工作原理。

a b c 
    2 11 -0.576309 
    2 11 -0.578449 
    2 11 -1.085822 
    2 11 9.000000 
    2 11 9.000000 
    2 11 -1.081405 
1

開始與..

df = pd.DataFrame({'a':randrange(1,10),'b':randrange(10,20),'c':np.random.randn(10)}) 
a b c 
0 7 12 0.475248 
1 7 12 -1.090855 
2 7 12 -1.227489 
3 7 12 0.163929 

端與...

df.ix[df.A < 1,df.A = df['c'] - df['d']]; df 
    a b c 
0 7 12 5.000000 
1 7 12 5.000000 
2 7 12 5.000000 
3 7 12 5.000000 
4 7 12 1.813233