3

假设我有一个DataFrame这样的,

df = pd.DataFrame([['x', 1, 2], ['x', 1, 3], ['y', 2, 2]], 
                  columns=['a', 'b', 'c'])

c == 2要选择and的所有行a == 'x',我可以做类似的事情,

df[(df['a'] == 'x') & (df['c'] == 2)]

或者我可以通过制作临时变量来迭代细化,

df1 = df[df['a'] == 'x']
df2 = df1[df1['c'] == 2]

有没有办法对行进行迭代优化?

(
  df
  .refine(lambda row: row['a'] == 'x')     # this method doesn't exist
  .refine(lambda row: row['c'] == 2)
)
4

2 回答 2

1

虽然目前这不是解决方案,但在 pandas 0.13 版中,您将能够做到

df.query('a == "x"').query('c == 2')

达到你想要的。

你也可以做

df['a == "x"']['c == 2']

df['a == "x" and c == 2']

有什么问题

df[(df.a == 'x') & (df.c == 2)]

直到 0.13?

于 2013-08-29T21:30:36.633 回答
0

如果您有多个条款;您直到运行时才知道的数量,您可以执行以下操作。我并不是说这完全是实现目标的好方法,但我看不到 Pandas 0.14.1 的替代方案:

df = pd.DataFrame([['x', 1, 2], ['x', 1, 3], ['y', 2, 2]],
                  columns=['a', 'b', 'c'])

conditions = {'a': 'x', 'c': 2}

def esc(term):
    if isinstance(term, str):
        return '"%s"' % term
    return str(term)

q_parts = ["%s == %s" % (k, esc(v)) for k, v in conditions.items()]
q = ' and '.join(q_parts)

print df.query(q)

当然,需要进一步扩展 esc 函数或更广泛的代码片段以处理逻辑非、is x in (x, y, z) 等...

于 2014-08-21T16:44:37.343 回答