2013-08-27 148 views
5

比方說,我的數據幀包含以下數據:如何計算基於其他列的大熊貓值的新列 - 蟒蛇

>>> df = pd.DataFrame({'a':['l1','l2','l1','l2','l1','l2'], 
         'b':['1','2','2','1','2','2']}) 
>>> df 
    a  b 
0 l1  1 
1 l2  2 
2 l1  2 
3 l2  1 
4 l1  2 
5 l2  2 

l1應與1l2應該對應於2。 我想創建一個新列'c',使得對於每一行,c = 1如果a = l1b = 1(或a = l2b = 2)。如果a = l1b = 2(或a = l2b = 1)則爲c = 0

產生的數據幀應該是這樣的:

a   b c 
0 l1  1 1 
1 l2  2 1 
2 l1  2 0 
3 l2  1 0 
4 l1  2 0 
5 l2  2 1 

我的數據幀是非常大的,所以我真的在尋找最有效的方式做到這一點使用大熊貓。

回答

8
df = pd.DataFrame({'a': numpy.random.choice(['l1', 'l2'], 1000000), 
        'b': numpy.random.choice(['1', '2'], 1000000)}) 

甲快速的解決方案假定只有兩個不同的值:

%timeit df['c'] = ((df.a == 'l1') == (df.b == '1')).astype(int) 

10循環,最好的3:每循環178毫秒

@Viktor Kerkes:

%timeit df['c'] = (df.a.str[-1] == df.b).astype(int) 

個1循環,最好的3:每次循環

412毫秒@ user1470788:

%timeit df['c'] = (((df['a'] == 'l1')&(df['b']=='1'))|((df['a'] == 'l2')&(df['b']=='2'))).astype(int) 

1個循環,最好的3:每循環363毫秒

@herrfz

%timeit df['c'] = (df.a.apply(lambda x: x[1:])==df.b).astype(int) 

1個循環,每個循環最好3:387 ms

+1

有趣的是,您的解決方案明顯不那麼普遍。這裏有趣的是,與簡單的lambda相比,'str [1]'方法有多糟糕。 –

+0

你沒有測試'(df.a =='l2')==(df.b =='2')'。 –

+0

@StevenRumbalski我假設示例輸入已完成,並且'a'只有值'l1'或'l2'和'b'只有''1''或''2''。如果'a!='l1',它必須是''''。 – chlunde

2

df['c'] = (df.a.apply(lambda x: x[1:])==df.b).astype(int)

6

您也可以使用字符串的方法。

df['c'] = (df.a.str[-1] == df.b).astype(int) 
0

您可以使用邏輯運算符。我不確定你爲什麼使用1和2的字符串而不是整數,但這裏有一個解決方案。最後的astype將它從布爾值轉換爲0和1。

df['c'] = (((df['a'] == 'l1')&(df['b']=='1'))|((df['a'] == 'l2')&(df['b']=='2'))).astype(int)