2017-12-24 11 views
2

私はif x in y文を実行するとValueErrorをスローするパンダで実行している小さな関数を持っています。ブーリアンインデックス、.isin()、およびwhere()を推奨する同様の問題が発生しましたが、いずれの例も私の場合には適用できませんでした。どんなアドバイスも非常に高く評価されます。パンダ:ループを反復する代替手段

その他の注意:groupsは、データフレーム外の文字列を含むリストです。この関数の私の目標は、データフレームのアイテムがどのリストにあるのかを確認し、そのリストのインデックスを返します。私の最初のバージョンのノートブックリンクでは、iterrowsを使ってデータフレームをループしていますが、ほとんどの場合、これは最適ではないと私は理解しています。いくつかの偽のデータと

Jupyterノート:https://github.com/amoebahlan61/sturdy-chainsaw/blob/master/Grouping%20Test_1.1.ipynb

ありがとうございました!

コード:

def groupFinder(item): 
    for group in groups: 
     if item in group: 
      return groups.index(group) 

df['groupID2'] = groupFinder(df['item']) 


--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-16-808ac3e51e1f> in <module>() 
     4    return groups.index(group) 
     5 
----> 6 df['groupID2'] = groupFinder(df['item']) 

<ipython-input-16-808ac3e51e1f> in groupFinder(item) 
     1 def groupFinder(item): 
     2  for group in groups: 
----> 3   if item in group: 
     4    return groups.index(group) 
     5 

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\generic.py in __nonzero__(self) 
    953   raise ValueError("The truth value of a {0} is ambiguous. " 
    954       "Use a.empty, a.bool(), a.item(), a.any() or a.all()." 
--> 955       .format(self.__class__.__name__)) 
    956 
    957  __bool__ = __nonzero__ 

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

ソリューション 私はいくつかのパンダのブログ記事に出くわしたとも私にapply機能をパンダを使用してiterrowsを使用してスキップし溶液を得たのredditユーザーからのフィードバックを得ました。

df['groupID2'] = df.item.apply(groupFinder) 

ご協力いただきありがとうございます。

+0

一般に、質問にはデータへのリンクを含めるのは良い考えではありません。リンクは死ぬことも、もう1つは死ぬこともあります。この場合、リンク*をクリックしてもノートブックには行きません(URLストリングをブラウザにコピーしても機能します)。あなたの質問を参照として使用する可能性のある他の人のために、サンプルデータと設定をあなたの投稿のテキストに[最小限の完全で証明可能な例]として移動することを検討してください(https://stackoverflow.com/help/ mcve)。 –

+0

@andrew_reece質問とコードの礼儀で頭をアップしていただきありがとうございます。今後もそれを必ず使用していきます。 –

答えて

0

isinを使用する方法は、最初にSeries.isin(...)を呼び出してブール値のマスクを生成し、このマスクを使用してインデックスを付けることです。または、シリーズではなくリスト上で関数を使用するには、groupFinder(df['item'].values)と呼ぶことができます。

0

IIUC、あなたはパンダを使用してわずか数行であなたがやりたいことができます。itemListにグループに各項目を取得するために今すぐ

import pandas as pd 

# create master list of items 
master = pd.Series(legumesGroup + herbGroup + radishGroup) 

# assign group id as index 
master.index = [0]*len(legumesGroup) + [1]*len(herbGroup) + [2]*len(radishGroup) 

# sample from master with replacement to get itemList 
itemList = master.sample(n=1000, replace=True) 

であり、グループIDに加えて項目を参照してくださいitemListのいずれかを呼び出して、またはちょうどitemList.index

itemList.head() 

出力:

2  Horseradish 
2   Rutabaga 
2    Turnip 
0   Chickpeas 
0  Pinto beans 
+0

これは本当に興味深い解決策です。グループ項目にインデックス値を追加することについては考えていませんでした。ありがとう! –

0

ソリューション

私はいくつかのパンダのブログ記事に出くわしたとも私に使ってiterrowsを使用してスキップし溶液を得たのredditユーザーからのフィードバックを得ましたパンダの適用機能。

df['groupID2'] = df.item.apply(groupFinder) 

ご協力いただきありがとうございます。