2016-08-05 6 views
1

私は米国のポーリングデータを分析しようとしています。具体的には、どの州が安全か、限界か、タイトであるかを調べようとしています。私は、時間とその「近さ」による調査結果を持つデータフレームを持っています。私はこのパンダのステートメントを使って、「親密さ」の項目の概要を取得しています。Pandasシリーズから行が配列されている行を選択する

s=self.daily.groupby('State')['closeness'].unique() 

これは私は、このシリーズ(簡潔にするため図示選択)与えている:行が型配列のものであるので、例えば、s[0]が与える

State 
AK      [safe] 
AL      [safe] 
CA      [safe] 
CO [safe, tight, marginal] 
FL   [marginal, tight] 
IA [safe, tight, marginal] 
ID      [safe] 
IL      [safe] 
IN    [tight, safe] 
Name: closeness, dtype: object 

を:

array(['safe'], dtype=object) 

Iをこのシリーズから選択しようとしていますが、私は構文の権利を得ることができません。例えば、私はこの構文を使用しただけで「安全」の状態を選択しようとしている:

ipdb> s[s == 'safe'] 
*** ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

これはどちらか動作しません:

test[test == ['safe']) 

は、ここで私がやりたいものだ:選択します「限界的」または「緊密」である国は、「安全な」状態と「安全な」状態のみを選択します。誰もが私が使うはずの構文、または最初のより良いアプローチについて考えている人はいますか?

============ はここGROUPBY前のデータのサンプルです:

ipdb> self.daily.head(3) 
     Date Democratic share Margin Method Other share \ 

0 2008-11-04   0.378894 -0.215351 Election  0.026861 
1 2008-11-04   0.387404 -0.215765 Election  0.009427 
2 2008-11-04   0.388647 -0.198512 Election  0.024194 

    Republican share State closeness  winner 
0   0.594245 AK  safe Republican 
1   0.603169 AL  safe Republican 
+0

'groupby'を実行する前にサンプルデータを投稿できますか? – shivsn

+0

ありがとうshivsn - 質問にサンプルを追加 –

答えて

1

は、あなたが一連のリストとデータフレームを持っていると言う、言う:

df = pd.DataFrame({'a': [['safe'], ['safe', 'tight'], []]}) 

その後、正確に安全であるものを見るために、あなたが使用することができます。

In [7]: df.a.apply(lambda x: x == ['safe']) 
Out[7]: 
0  True 
1 False 
2 False 
Name: a, dtype: bool 

どの税込ものを見つけるために安全な場合は、

In [9]: df.a.apply(lambda x: 'safe' in x) 
Out[9]: 
0  True 
1  True 
2 False 
Name: a, dtype: bool 

などが使用できます。

0

OPによって与えられたデータフレームのサンプル:

In[66]:df 
Out[66]: 
     Date Democratic share Margin Method Other share 0 2008-11-04   0.378894 -0.215351 Election  0.026861 
1 2008-11-04   0.387404 -0.215765 Election  0.009427 
2 2008-11-04   0.388647 -0.198512 Election  0.024194 
3 2008-11-04   0.384547 -0.194545 Election  0.024194 
4 2008-11-04   0.345330 -0.194512 Election  0.024459 

    Republican share State closeness  winner 
0   0.594245 AK  safe Republican 
1   0.603169 AL  safe Republican 
2   0.454545 CA  tight Democratic 
3   0.453450 CO marginal Democratic 
4   0.454545 FL  tight Republic 

その後、grupby使用して:np.whereを使用して、その後

In[67]:s=df.groupby('State')['closeness'].unique() 

In[68]:s 
Out[68]: 
State 
AK  [safe] 
AL  [safe] 
CA  [tight] 
CO [marginal] 
FL  [tight] 

を:

In[69]:s.ix[np.where(s=='safe')] 
Out[69]: 
State 
AK [safe] 
AL [safe] 
Name: closeness, dtype: object 
+0

これは私に空のシリーズを与えます... –

+0

@ AlbertoGarcia-Raboso値の配列を持つシリーズを取得しているオペレーションの方法で行っても、それはありません。答え。 – shivsn

+0

[チャット](https://chat.stackoverflow.com/rooms/120309/selecting-rows-from-pandas-series-where-rows-are-arrays)でこの議論を続けましょう。 –

0

私は.unique()をされて使用することにより、一連sを構築すると思いますこの問題を攻撃する最善の方法ではありません。代わりにpd.crosstabを使用してください。

import pandas as pd 

daily = pd.DataFrame({'State': ['AK', 'AL', 'CA', 'CO', 'CO', 'CO', 'FL', 
           'FL', 'IA', 'IA', 'IA', 'ID', 'IL', 'IN', 'IN'], 
         'closeness': ['safe', 'safe', 'safe', 'safe', 'tight', 
            'marginal', 'marginal', 'tight', 'safe', 
            'tight', 'marginal', 'safe', 'safe', 
            'tight', 'safe']}) 
ct = pd.crosstab(daily['State'], daily['closeness']) 
print(ct) 

出力:

closeness marginal safe tight 
State       
AK    0  1  0 
AL    0  1  0 
CA    0  1  0 
CO    1  1  1 
FL    1  0  1 
IA    1  1  1 
ID    0  1  0 
IL    0  1  0 
IN    0  1  1 

一つ一方、このctはあなたsとまったく同じ情報が含まれています。もう一方では、あなたが望むように州を選択するのは簡単です。

# states that are 'marginal' or 'tight' 
print(ct.query('marginal > 0 | tight > 0').index.values) 
# => ['CO', 'FL', 'IA', 'IN'] 

# States that are 'safe' and only 'safe' 
print(ct.query('safe > 0 & marginal == 0 & tight == 0') 
     .index.values) 
# => ['AK', 'AL', 'CA', 'ID', 'IL'] 

しかし、あなたはあなたのsを使う、という場合は、ここにあなたがそれからctを構築することができる方法である:

# states that are 'marginal' or 'tight' 
print(ct.loc[(ct['marginal'] > 0) | (ct['tight'] > 0)] 
     .index.values) 
# => ['CO', 'FL', 'IA', 'IN'] 

# States that are 'safe' and only 'safe' 
print(ct.loc[(ct['safe'] > 0) & (ct['marginal'] == 0) & (ct['tight'] == 0)] 
     .index.values) 
# => ['AK', 'AL', 'CA', 'ID', 'IL'] 

または、おそらくより読みやすい.query()を使用して:

あなたが提案した二つの例
ct = s.str.join(' ').str.get_dummies(sep=' ') 
関連する問題