2017-11-20 9 views
3

DataFrameの場合、1つの列に対して異なる行が同じ値を持つことがあります。一例として
DataFrameをDataFrameに分割する

ここ
import pandas as pd 
df = pd.DataFrame({ 
    "Name" : ["Alice", "Bob", "John", "Mark", "Emma" , "Mary"] , 
    "City" : ["Seattle", "Seattle", "Portland", "Seattle", "Seattle", "Portland"] }) 

    City  Name 
0 Seattle Alice 
1 Seattle Bob 
2 Portland John 
3 Seattle Mark 
4 Seattle Emma 
5 Portland Mary 

、いくつかの列によって共有される「都市」(例えば、「ランド」)のために指定された値。

このデータフレームから、1つの列の値を共通に持つ複数のデータフレームを作成したいとします。上記の例では、私は、次のデータフレームを取得したい:

 City  Name 
0 Seattle Alice 
1 Seattle Bob 
3 Seattle Mark 
4 Seattle Emma 

 City  Name 
2 Portland John 
5 Portland Mary 

このanswerから、私は1つのデータフレームを生成するために使用することができるマスクを作成しています:

def mask_with_in1d(df, column, val): 
    mask = np.in1d(df[column].values, [val]) 
    return df[mask] 

# Return the last data frame above 
mask_with_in1d(df, 'City', 'Portland') 

問題は、名前が割り当てられるすべてのデータフレームを効率的に作成することです。私はそれをこのようにやっている:私がさらに操作することができ、データフレームdf_Seattledf_Portlandを与える

unique_values = np.sort(df['City'].unique()) 
for city_value in unique_values: 
    exec("df_{0} = mask_with_in1d(df, 'City', '{0}')".format(city_value)) 

これを行うには良い方法がありますか?

+0

再現性のある質問。どうも。 – Kanak

答えて

4

これを実行したい都市のリストがありますか?最も簡単な解決策は、都市によってグループにあり、あなたが仕事にdf_city["Portland"]を望んでいたならば、グループ

for city, names in df.groupby("City"): 
    print(city) 
    print(names) 

Portland 
     City Name 
2 Portland John 
5 Portland Mary 
Seattle 
     City Name 
0 Seattle Alice 
1 Seattle Bob 
3 Seattle Mark 
4 Seattle Emma 

以上のループは、辞書やこのようないくつかの(df_city[city] = names)に割り当てることができますすることができます。あなたが一度分割したグループで何をしたいかによって異なります。

+0

ありがとう、間違いなくクリーナー。私は、データフレーム内のすべてのユニークな都市値に対してこれを実行します。辞書を作成することは、私のユースケースにとって最良のアプローチです。 – unfolx

2

あなたはこのためにgroupbyを使用することができます。

dfs = [gb[1] for gb in df.groupby('City')] 

これはデータフレーム、'City'列の値ごとに1のリストを構築します。

場合は、あなたがデータフレームの値を持つタプルをしたい、あなたが使用することができます。

dfs = list(df.groupby('City')) 

名前で割り当てること通常、アンチパターンであること。 execevalは間違いなく反パターンです。

+0

これらの代替案について、出力データ構造に関して知ってうれしいです。私は、私が取り組んでいるものではない別のコードから 'exec'について学びました。これが一般的に回避されるべきであることを知っておくとよいでしょう。 (ちょうどこのアンチパターン[小さな本](https://docs.quantifiedcode.com/python-anti-patterns/)が見つかりました。 – unfolx

関連する問題