3

私がそのDataFrameようなものを持っているとしましょう、

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

c == 2とのすべての行を選択する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 関数またはより広いスニペットは、logical-NOT、is x in (x, y, z) などを処理するためにさらに拡張する必要があります...

于 2014-08-21T16:44:37.343 に答える