如何基于其他列的非平凡函数选择/添加列到pandas数据帧

时间:2015-01-12 23:13:54

标签: function select pandas dataframe multiple-columns

这是此问题的后续问题: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是列表列表,如果a和a不是同一子列表的一部分,则f返回True。 也就是说,如果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 个答案:

答案 0 :(得分:1)

这是非常非常 hacky和非优雅的解决方案。作为另一个免责声明,因为如果列中的数字不在任何子列表中,那么您的问题并没有说明您想要做什么,除了{中的任何默认功能外,此代码不会以任何实际方式处理该问题。 {1}}。

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 迭代原始的列表集,改进变量名,提出更好的解决方案,等等。)

希望这会有所帮助。哦,我提到这是hacky而不是很好的代码?因为它是。