2017-08-03 22 views
1

私はifのステートメントを実行しようとしているときにこの質問が以前に尋ねられていることを知っています。私はこのlinkを見ましたが、私の場合はあまり役に立ちませんでした。私のdfsはDataFramesのリストです。私は次のことをしようとしていますエラー:シリーズの真理値はあいまいです - Python pandas

for i in dfs: 
    if (i['var1'] < 3.000): 
     print(i) 

は、次のエラーを与える:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

私は、次のと同じエラーを取得しようとしました。

for i,j in enumerate(dfs): 
    if (j['var1'] < 3.000): 
     print(i) 

マイvar1データ型がfloat32です。私は他のlogical演算子と&または|を使用していません。上記のリンクでは、論理演算子を使用しているように見えました。 ValueErrorはなぜ手に入りますか?

+0

は、リスト内のすべてのDFSが一列のみを持っているのですか? – MaxU

+1

いつ 'if'が真であるべきですか?瞬間から、そのような行が少なくとも1つありますか?または、すべての値が3より小さい瞬間からですか? –

+0

この場合は明らかではありません - あなたは 'if ...'で何を比較していますか? – MaxU

答えて

4

をチェックアウトすることができ、これはhappenningされている理由を示している、小さなデモです:

In [131]: df = pd.DataFrame(np.random.randint(0,20,(5,2)), columns=list('AB')) 

In [132]: df 
Out[132]: 
    A B 
0 3 11 
1 0 16 
2 16 1 
3 2 11 
4 18 15 

In [133]: res = df['A'] > 10 

In [134]: res 
Out[134]: 
0 False 
1 False 
2  True 
3 False 
4  True 
Name: A, dtype: bool 

を私たちは、このようなシリーズがTrueあるかどうかを確認しようとすると - パンダはしていません何をすべきか知っている:

In [135]: if res: 
    ...:  print(df) 
    ...: 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
... 
skipped 
... 
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

回避策:

を我々はブール値のシリーズを治療するための方法を決定することができます - 例えば、のためにすべて値がTrueをしているTrue場合返す必要があります:

In [136]: res.all() 
Out[136]: False 

または少なくとも1値がtrueの場合:

In [137]: res.any() 
Out[137]: True 

In [138]: if res.any(): 
    ...:  print(df) 
    ...: 
    A B 
0 3 11 
1 0 16 
2 16 1 
3 2 11 
4 18 15 
+0

この説明は役に立ちます。 –

+0

@ i.n.n.m、ありがとうございます! – MaxU

1

現在、比較のためにシリーズ全体を選択しています。そのように(ドキュメントはこの1つに希薄である)あなたがseries.iteritemsを使用することができ、個々の要素のそれぞれを比較するには

for i in dfs: 
if (i['var1'].iloc[0] < 3.000): 
    print(i) 

:シリーズから個々の値を取得するには、の線に沿って何かを使用したいと思います。

for i in dfs: 
    for _, v in i['var1'].iteritems(): 
     if v < 3.000: 
      print(v) 

ほとんどの場合はこちらよりよい解決策はそうのように、何が必要に使用するデータフレームのサブセットを選択することです:PANDで

for i in dfs: 
    subset = i[i['var1'] < 3.000] 
    # do something with the subset 

パフォーマンス個々の値を反復するのではなく、直列演算を使用するときに大規模なデータフレームではるかに高速です。詳細については、あなたはここでパンダdocumentation on selection.

関連する問題