如何在写入列表时过滤Pandas系列

问题描述 投票:2回答:4

对于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是最快的。

python pandas
4个回答
2
投票

使用列表理解

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()

2
投票

有两点需要注意:

  • 链式索引是explicitly discouraged;避免,因为它是永远不必要的。
  • 如果您要与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()

1
投票

您可以使用query以获得更多可读性:

tbl.query('A != "."')['A'].tolist()

0
投票

使用临时变量和两行代码使其更具可读性:

exclude   = tbl['A'].isin(['.'])
list_of_A = tbl['A'][~exclude].tolist()
© www.soinside.com 2019 - 2024. All rights reserved.