这是此问题的后续问题: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
谢谢!
答案 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而不是很好的代码?因为它是。