对于pandas数据框'A'
中的给定列'tbl'
,我一直在尝试编写列.tolist()
并过滤掉'.'
的项目。这有效,但似乎不太可读:
list_of_A = tbl['A'][~tbl['A'].isin(['.'])].tolist()
此外,检查一个列表似乎不必要地缓慢,虽然str.contains('.')
似乎会因为模式匹配而变慢。我错过了一个更好的方法吗?
更新:@ jpp,@ piRSquared和@ Scott-Boston都有很好的方法,所以它归结为一个测试:
>>> tbl = pd.DataFrame(np.random.randn(50000, 3), columns=list('ABC'))
>>> tbl.loc[tbl.sample(10000).index, 'A'] = '.'
>>> min(timeit.repeat("list_of_A = tbl.loc[tbl['A'].ne('.'), 'A'].tolist()", repeat=1000, number=100, globals=globals()))
0.37328900000102294
>>> min(timeit.repeat("list_of_A = tbl.A.values[tbl.A.values != '.'].tolist()", repeat=1000, number=100, globals=globals()))
0.1470019999997021
>>> min(timeit.repeat("tbl.query('A != \".\"')['A'].tolist()", repeat=1000, number=100, globals=globals()))
0.45748099999946135
发现.loc
为我开辟了一个充满可能性的世界,但要粉碎'n'抓住过滤列列表,看起来像转换为ndarray是最快的。
使用列表理解
list_of_A = [x for x in df['A'] if x != '.']
可能性能更高
list_of_A = [x for x in df['A'].values.tolist() if x != '.']
更快
tbl.A.values[tbl.A.values != '.'].tolist()
有两点需要注意:
isin
/ list
/ set
进行比较,则仅推荐使用pd.Series
。使用loc
运算符的==
访问器应该足够了。试试这个:
list_of_A = tbl.loc[~(tbl['A'] == '.'), 'A'].tolist()
正如@BradSolomon指出的那样,还有另一种选择:
list_of_A = tbl.loc[tbl['A'].ne('.'), 'A'].tolist()
您可以使用query
以获得更多可读性:
tbl.query('A != "."')['A'].tolist()
使用临时变量和两行代码使其更具可读性:
exclude = tbl['A'].isin(['.'])
list_of_A = tbl['A'][~exclude].tolist()