この質問が以前に尋ねられたことは知っていますが、if
ステートメントを実行しようとしてエラーが発生します。私はこれを見て link ですが、私の場合はあまり役に立ちませんでした。私のdfs
はデータフレームのリストです。
私は以下を試しています、
for i in dfs:
if (i['var1'] < 3.000):
print(i)
次のエラーが発生します。
ValueError:Seriesの真理値があいまいです。 a.empty、a.bool()、a.item()、a.any()またはa.all()を使用します。
[〜#〜]と[〜#〜]以下を試したところ、同じエラーが発生しました。
for i,j in enumerate(dfs):
if (j['var1'] < 3.000):
print(i)
私のvar1
データ型はfloat32
です。他のlogical
演算子と&
または|
を使用していません。上記のリンクでは、論理演算子を使用していることが原因のようです。 ValueError
を取得する理由
これがなぜ起こっているのかを示す小さなデモです:
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
そのようなSeriesがTrue
であるかどうかを確認しようとすると-Pandasは何をすべきかわかりません:
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().
回避策:
ブール値のシリーズの処理方法を決定できます。たとえば、_allの値がif
の場合、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
現在、シリーズ全体を選択して比較しています。シリーズから個別の値を取得するには、次のように何かを使用する必要があります。
for i in dfs:
if (i['var1'].iloc[0] < 3.000):
print(i)
個々の要素をそれぞれ比較するには、次のように series.iteritems (これはドキュメントがまばらです)を使用できます。
for i in dfs:
for _, v in i['var1'].iteritems():
if v < 3.000:
print(v)
ほとんどの場合、ここでのより良い解決策は、次のように、必要なものに使用するデータフレームのサブセットを選択することです。
for i in dfs:
subset = i[i['var1'] < 3.000]
# do something with the subset
pandasでのパフォーマンスは、個々の値を反復処理する代わりに系列演算を使用すると、大きなデータフレームではるかに高速になります。詳細については、pandas- 選択に関するドキュメント。