0

私はパンダが初めてで、パンダの操作方法を学ぼうとしています。wes のビデオやノートブックで見た例を自分のデータに使用しようとすると、問題が発生します。次のような csv ファイルがあります。

filePath,vp,score
E:\Audio\7168965711_5601_4.wav,Cust_9709495726,-2
E:\Audio\7168965711_5601_4.wav,Cust_9708568031,-80
E:\Audio\7168965711_5601_4.wav,Cust_9702445777,-2
E:\Audio\7168965711_5601_4.wav,Cust_7023544759,-35
E:\Audio\7168965711_5601_4.wav,Cust_9702229339,-77
E:\Audio\7168965711_5601_4.wav,Cust_9513243289,25
E:\Audio\7168965711_5601_4.wav,Cust_2102513187,18
E:\Audio\7168965711_5601_4.wav,Cust_6625625104,-56
E:\Audio\7168965711_5601_4.wav,Cust_6073165338,-40
E:\Audio\7168965711_5601_4.wav,Cust_5105831247,-30
E:\Audio\7168965711_5601_4.wav,Cust_9513082770,-55
E:\Audio\7168965711_5601_4.wav,Cust_5753907026,-79
E:\Audio\7168965711_5601_4.wav,Cust_7403410322,11
E:\Audio\7168965711_5601_4.wav,Cust_4062144116,-70

それをデータフレームにロードし、「filePath」と「vp」でグループ化します。コードは次のとおりです。

res = df.groupby(['filePath','vp']).size()    
res.index

出力は次のとおりです。

[E:\Audio\7168965711_5601_4.wav                  Cust_2102513187,
Cust_4062144116,                                 Cust_5105831247,
Cust_5753907026,                                 Cust_6073165338,
Cust_6625625104,                                 Cust_7023544759,
Cust_7403410322,                                 Cust_9513082770,
Cust_9513243289,                                 Cust_9702229339,
Cust_9702445777,                                 Cust_9708568031,
Cust_9709495726]

今、私は例で見たように、辞書のようにインデックスにアプローチしようとしていますが、私がやっているとき

res['Cust_4062144116']

エラーが発生します:

KeyError: 'Cust_4062144116'

ファイルパスを入力すると結果が得られますが、以前の例で理解して見たように、vp キーも使用できるはずですが、そうではありませんか?

些細なことで申し訳ありませんが、ある例では機能しているのに他の例では機能していない理由がわかりません。

4

2 に答える 2

0

2 つの列をグループ化すると、代わりに MultiIndex が返されます。これは、単一のインデックス値ではなく、それらを使用して列にスライスする必要があることも意味します。

あなた.size()の groupby オブジェクトは、それをシリーズに変換します。DataFrame で強制すると、.xsメソッドを使用して単一のレベルをスライスできます。

res = pd.DataFrame(df.groupby(['filePath','vp']).size())
res.xs('Cust_4062144116', level=1)

それはうまくいきます。シリーズとして保持したい場合は、次のようなブール値のインデックス付けが役立ちます。

res[res.index.get_level_values(1) == 'Cust_4062144116']

最後のオプションは少し読みにくいですが、より柔軟な場合もあります。たとえば、複数の値を一度にテストできます。

res[res.index.get_level_values(1).isin(['Cust_4062144116', 'Cust_6073165338'])]
于 2013-06-26T14:51:41.593 に答える