2016-10-10 1 views
1

は、このようなラムダ関数に基づいて一つの列を作成/変更するために役立つことができれば上のベースステートメントをインラインで、オペレーションの外で別々に行うのではなく、ifステートメントでこれを行う。[パンダ]新しい列を割り当てるための方法私が割り当てる知っているの文

は、操作の外に他の何もせずにこれを実現することが可能です:

df.assign(c = lambda x: x.num_col.sum() if x.num_col > 0) 

上記のコマンドが返す「にSyntaxError:無効な構文」

答えて

2

IIUCあなたは、このようにそれを行うことができます。

データ:[0:6]

In [6]: df = pd.DataFrame(np.random.randn(10,2),columns=list('ab')) 

In [7]: df 
Out[7]: 
      a   b 
0 0.493970 1.095644 
1 0.128510 -0.542144 
2 0.136247 -0.544499 
3 -0.540835 -0.100574 
4 0.052725 -0.164856 
5 -1.201619 1.578153 
6 1.921872 0.505875 
7 -2.519725 0.282050 
8 -1.581868 -0.240352 
9 -0.071207 -1.366953 

In [8]: df.iloc[:6] 
Out[8]: 
      a   b 
0 0.493970 1.095644 
1 0.128510 -0.542144 
2 0.136247 -0.544499 
3 -0.540835 -0.100574 
4 0.052725 -0.164856 
5 -1.201619 1.578153 
6 1.921872 0.505875 

は、インデックスのa列に正の値の合計を見つけてみましょう

In [9]: df.iloc[:6].query('a > 0').a.sum() 
Out[9]: 2.733322288547374 

解決策:

列の名前が変更された
In [10]: df.iloc[:6].assign(c=lambda x: x.query('a > 0').a.sum()) 
Out[10]: 
      a   b   c 
0 0.493970 1.095644 2.733322 
1 0.128510 -0.542144 2.733322 
2 0.136247 -0.544499 2.733322 
3 -0.540835 -0.100574 2.733322 
4 0.052725 -0.164856 2.733322 
5 -1.201619 1.578153 2.733322 
6 1.921872 0.505875 2.733322 

同じ:

In [11]: df.iloc[:6].rename(columns={'a':'AAA', 'b':'BBB'}).assign(c=lambda x: x.query('AAA > 0').AAA.sum()) 
Out[11]: 
     AAA  BBB   c 
0 0.493970 1.095644 2.733322 
1 0.128510 -0.542144 2.733322 
2 0.136247 -0.544499 2.733322 
3 -0.540835 -0.100574 2.733322 
4 0.052725 -0.164856 2.733322 
5 -1.201619 1.578153 2.733322 
6 1.921872 0.505875 2.733322 

UPDATE

はパンダ0.20.1 the .ix indexer is deprecated, in favor of the more strict .iloc and .loc indexersから始まります。

+0

ありがとうございますが、dfはすでに数多くの操作を含んでいますが、これはまだ操作を分離する必要があります。 –

+0

@青田ゆん、私はそれを取得していない - あなたはどういう意味ですか?あなたは新しい__virtual__カラム( 'assign'メソッドを使って)または__permanent__カラムを必要としますか? – MaxU

+0

df.ix []。rename()... assign()などの代入を行う前に、dfの背後にある多くの操作を実行したいので、仮想の代入となります。したがって、dfはassign関数を適用する元のdfではありません。 –

0

あなたがしているので、構文が無効です。三項条件を使用して、最初の半分だけを使用します。

df = (
    df 
    .assign(c = lambda x: x.num_col.sum() if x.num_col > 0 else 0) 
) 

注終わりelse 0の追加:あなたのケースでは

a = 1 if b > 0 else 0 

は、あなたのような何かを書くことができます:

三の条件は、あなたがこのようなif文を書くことができます。

+0

このコードを実行しようとしましたか?私はそれが実際に動作するとは思わない。 – shawnheide

+0

この知識を共有してくれてありがとう。しかし、それはエラーで動作しません:ValueError:シリーズの真理値はあいまいです。 a.empty、a.bool()、a.item()、a.any()またはa.all()を使用します。 –

関連する問題