2017-08-02 9 views
1

こんにちはすべてをチェックするので、私は、データフレームを持っている:ループは、辞書のキーに対して

df1 
    WM   WH   WP   LC_REF 
0 Tesla  Doritos  Spiders  DT 17 1C 
1 Merc  Lays  Contortion  DT 17 1C 
2 Lambo  Finale  NaN   DT 17 1C 
3 Reddy  Red   NaN   DT 17 1C 
4 Tomball  Fools  NaN   DT 17 1C 

と私は内の各項目をチェックするための最も効率的な方法を知りたいと思った辞書

example = {'Fools':'Car','Red':'Car','Merc':'Car','Tesla':'Car','Doritos':'Food','Spiders':'Food','Reddy':'Food','Tomball':'Food'} 

列の値が 'Car'または 'Food'の値と一致する場合、目的の出力は次のようになります。

df2 if key matches Car 

    LC_REF vals  Category 
0 DT 17 1C Merc,Tesla WM 
1 DT 17 1C Red, Fools WH 


df3 if key matches Food 

    LC_REF vals     Category 
0 DT 17 1C Reddy,Tomball   WM 
1 DT 17 1C Doritos, Lays   WH 
2 DT 17 1C Spiders, Contortion WP 

は、これまでのところ

df = df.groupby('LC_REF',sort=False).agg(lambda x: ','.join(x.astype(str).str.upper()).replace(' ','')).stack().rename_axis(('LC_REF','a')).reset_index(name='vals') 

は、それらのグループに私のコードですが、私はそれらを正しく分離する方法に苦しんでいます。この複雑な問題の助けを借りることは素晴らしいことです。

答えて

1

は、以下のことを試してみてください。

import pandas as pd 
import io 


example = {'Fools':'Car','Red':'Car','Merc':'Car', 
      'Tesla':'Car','Doritos':'Food', 
      'Spiders':'Food','Reddy':'Food', 
      'Tomball':'Food', 'Lays':'Food', 'Contortion': 'Food'} 

# Flip the example dictionary around (keys become values and values become keys) 
value_dict = {} 
for k, v in example.items(): 
    value_dict.setdefault(v, []) 
    value_dict[v].append(k) 

text = u"""WM   WH   WP   LC_REF 
Tesla  Doritos  Spiders  DT 17 1C 
Merc  Lays  Contortion DT 17 1C 
Lambo  Finale  NaN   DT 17 1C 
Reddy  Red   NaN   DT 17 1C 
Tomball  Fools  NaN   DT 17 1C""" 

df1 = pd.read_table(io.StringIO(text), header=0, sep="\s{2,}", engine='python') 
# Melt the dataframe first 
df2 = pd.melt(df1, id_vars=['LC_REF'], value_name='vals', var_name='Category') 

# Get your dataframe for Food 
food_df = df2.loc[df2.vals.isin(value_dict.get('Food'))].groupby(['LC_REF', 'Category']).apply(lambda x: ', '.join(x.vals)).reset_index() 
print(food_df) 

#  LC_REF Category     0 
# 0 DT 17 1C  WH  Doritos, Lays 
# 1 DT 17 1C  WM  Reddy, Tomball 
# 2 DT 17 1C  WP Spiders, Contortion 

# Get your dataframe for Car 
car_df = df2.loc[df2.vals.isin(value_dict.get('Car'))].groupby(['LC_REF', 'Category']).apply(lambda x: ', '.join(x.vals)).reset_index() 
print(car_df) 

#  LC_REF Category   0 
# 0 DT 17 1C  WH Red, Fools 
# 1 DT 17 1C  WM Tesla, Merc 

いくつかのガイドの手順:example辞書周り

  1. フリップ:キーに値と値のリストへの鍵。これを行うと、アイテムの検索に役立ちます。 Foodに関連するすべてのアイテムを1つのリストに入れ、Carに関連するアイテムを別のリストに入れます。このようにして、列にFood個のアイテムが含まれているかどうかを確認するには、の方法を使用してFoodアイテムのリストを提供するだけです。同様に、Carアイテムを探すときも同じ手順に従います。 (df1)。これにより、データフレームは後続の操作に役立つ(幅広いものから長いものまで)形状になります。

  2. 使用valsFoodまたはCarのアイテムのいずれかを含む行を取得するためのブールインデックス。

  3. は、列LC_REFCategorygroup-by操作を使用して、vals列の項目に参加します。

これが役立ちます。

+0

ありがとうございます!好奇心が強い、なぜあなたは辞書を回しましたか? – codeninja

+0

@コーデニンジャー、編集を参照してください。 – Abdou

+0

編集していただきありがとうございます、私は今理解しています – codeninja

関連する問題