2

質問があります。レコードのリストがあり、最初のリストと比較している別のレコードのリストがあります。私が行を書くとき(最初のリストの行の読み取りの内側:

    for index, row in output_merged_po.iterrows():
        stock = output_merged_stock[output_merged_stock['PN_STRIPPED']==row['PN_STRIPPED']][['Whs']]
        print stock

結果が出ます

       Whs
 11763 VLN

11763 は output_merged_stock ID 番号で、Whs は PN_stripped が一致する倉庫の名前です。

しかし、さらに処理するためにデータを抽出できません。if を尋ねることができるシンプルな if ステートメントを書きたいだけですwhs = VLN。私が書いた:

                    if stock[['Whs']] == 'VLN':
                         print stock

エラーが発生しました:The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

私が書いた:

                    if stock == 'VLN':
                        print stock

そして、私は再び得ました:The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

結果「VLN」を取得したい場合、ifステートメントはどのように記述すればよいですか? たとえば、ストック出力が 3 Wh の場合があり、そのうちの 2 つが「VLN」で 3 つ目が「XRS」であり、その場合、「if」出力が XRS なしの VLN の 2 倍であることがわかります。

4

2 に答える 2

1

ところで、ここでは不要な df を、1 つ以上の一致がある可能性があるため、スカラー値をテストするためにあいまいになるため、正しくないスカラー値と比較しようとしています。

私はあなたが欲しいと思います:

if all(stock['Whs']] == 'VLN'):

または、行が 1 つしかないことがわかっている場合は、次のようにします。

if stock['Whs'].values[0] == 'VLN':

例:

In [79]:
# create some dummy data
df = pd.DataFrame({'a':np.arange(5), 'b':2})
df
Out[79]:
   a  b
0  0  2
1  1  2
2  2  2
3  3  2
4  4  2

あなたが試したようなことを試してください:

if df['a'] == 2:
    print("we have 2")

これは発生します:

ValueError: シリーズの真の値があいまいです。a.empty、a.bool()、a.item()、a.any() または a.all() を使用します。

したがって、エラーからヒントを得ることができます。

In [82]:

if any(df['a'] == 2):
    print("we have 2")
we have 2

all「b」列で使用できます。

In [83]:

if all(df['b'] == 2):
    print("all are 2")
all are 2

単一の行の値を持つシリーズを比較した場合、次のことができます。

In [84]:

if df.iloc[2]['a'] == 2:
    print("we have 2")
​
we have 2

ただし、複数の行があるとあいまいになります。

if df.iloc[1:3]['b'] == 2:
    print("we have 2")

再び発生ValueErrorしますが、次のように動作します。

In [87]:

if df.iloc[1:3]['b'].values[0] == 2:
    print("we have 2")
​
we have 2
于 2015-05-12T21:50:27.053 に答える