2015-01-12 83 views
0

這一個不平凡的功能大熊貓據幀一列是這一個後續問題:how to select/add a column to pandas dataframe based on a function of other columns?如何選擇/添加基於其他列

有一個數據幀,我想選擇相匹配的行一些標準。該標準是其他列的值和一些附加值的函數。

這裏是一個玩具例子:

>> df = pd.DataFrame({'A': [1,2,3,4,5,6,7,8,9], 
       'B': [randint(1,9) for x in xrange(9)], 
       'C': [4,10,3,5,4,5,3,7,1]}) 
>> 
    A B C 
0 1 6 4 
1 2 8 10 
2 3 8 3 
3 4 4 5 
4 5 2 4 
5 6 1 5 
6 7 1 3 
7 8 2 7 
8 9 8 1 

我想選擇其中的一些不平凡函數返回true,例如所有行f(a,c,L),其中L是列表列表,f返回True如果a和c不是同一個子列表的一部分。 也就是說,如果L = [[1,2,3],[4,2,10],[8,7,5,6,9]我想:

A B C 
0 1 6 4 
3 4 4 5 
4 5 2 4 
6 7 1 3 
8 9 8 1 

謝謝!

回答

1

這裏是一個非常非常 hacky和非優雅的解決方案。作爲另一個免責聲明,因爲如果列中的數字不在任何子列表中,您的問題沒有說明您想要執行的操作,除了isin()中的任何默認功能之外,此代碼不會以任何實際方式處理該問題。

import pandas as pd 

df = pd.DataFrame({'A': [1,2,3,4,5,6,7,8,9], 
       'B': [6,8,8,4,2,1,1,2,8], 
       'C': [4,10,3,5,4,5,3,7,1]}) 

L = [[1,2,3],[4,2,10],[8,7,5,6,9]] 


df['passed1'] = df['A'].isin(L[0]) 
df['passed2'] = df['C'].isin(L[0]) 
df['1&2'] = (df['passed1']^df['passed2']) 

df['passed4'] = df['A'].isin(L[1]) 
df['passed5'] = df['C'].isin(L[1]) 
df['4&5'] = (df['passed4']^df['passed5']) 

df['passed7'] = df['A'].isin(L[2]) 
df['passed8'] = df['C'].isin(L[2]) 
df['7&8'] = (df['passed7']^df['passed8']) 

df['PASSED'] = df['1&2'] & df['4&5']^df['7&8'] 

del df['passed1'], df['passed2'], df['1&2'], df['passed4'], df['passed5'], df['4&5'], df['passed7'], df['passed8'], df['7&8'] 
df = df[df['PASSED'] == True] 
del df['PASSED'] 

,看起來像一個輸出:

A B C 
0 1 6 4 
3 4 4 5 
4 5 2 4 
6 7 1 3 
8 9 8 1 

我實現了這個碼的這個相當快,因此在徹底和完整的醜陋,但我相信你可以重構它任何你想要的方式(例如,用for sub_list in L迭代原始的列表集合,改進變量名稱,提出更好的解決方案等)。

希望這會有所幫助。哦,我有沒有提到這是不好的代碼?因爲它是。

+0

謝謝!我確實有自己的解決方案(添加列或明確迭代索引),它們確實不那麼優雅。我想知道是否有一些很好的解決方案可以採用該功能並優雅地進行操作。 – ScienceFriction

+0

我想你總是可以定義一個函數'f',它接受列'A',列'C'和列'L'的參數,然後'將其應用到你的數據幀中。請參閱 - > http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.apply.html –