2017-12-20 9 views
0

特定の列の行を他の列との関係で集約し、集計データをjson形式で含む特定の列を作成したいとします。行を組み合わせて、SQLまたはPythonでデータフレーム内の単一の行に挿入する方法

これは例です。

オリジナルデータテーブル

Child Name  Child Age Father Name Father Age 
    Peter    5  Richard   40 
    James   15   Doug   45 
     Liz    2   Doug   45 
     Paul    6  Richard   40 
    Shirly   11  Charles   33 
     Eva    9   Chris   29 

変換されたデータテーブルは、どちらか

Father Name Father Age  Children 
    Richard   40  {"Peter":"5", "Paul":"6"} 
     Doug   45  {"James":"15","Liz":"2"} 
    Charles   33  {"Shirly" : "11"} 
     Chris   29  {"Eva" : "9"} 

それとも

Father Name Father Age  Children Name  Children Age 
    Richard   40  {"Peter", "Paul"}  {"5","6"} 
     Doug   45  {"James", "Liz"}  {"15","2"} 
    Charles   33  {"Shirly"}    {"11"} 
     Chris   29  {"Eva"}     {"9"} 

私のコードがあるだろう

import pandas as pd 
df = pd.DataFrame({ 
    "Child Name" : ["Peter","James","Liz","Paul","Shirly","Eva"], 
    "Child Age" : ["5","15","2","6","11","9"], 
    "Father Name" : ["Richard","Doug","Doug","Richard","Charles","Chris"], 
    "Father Age" : ["40","45","45","40","33","29"] }) 

print df 

g1 = df.groupby(["Father Name"])["Child Name"].apply(", ".join).reset_index() 
g1.columns = ['Father Name','Children Name'] 
print g1 

と出力は、私は列に「父年齢」と「子ども時代」を追加する方法を見つけ出すことはできません

Father Name Children Name 
0  Charles   Shirly 
1  Chris    Eva 
2  Doug  James, Liz 
3  Richard  Peter, Paul 

になります。 これを最も効率的な方法でデータフレームでどのように変換できますか? 私は長い時間がかかるので、Python経由でループを避けたいです。

おかげで、

+1

あなたの元のテーブルには、正規化されていません。別の父親のテーブルと子供のテーブルが必要です。 – Anand

+0

元のテーブルの正規化についてはわかりません。簡単な例を使って詳細を詳しく説明できますか? –

答えて

2

クイック汚い非効率的なハックが、それはループのために回避します。より良い解決策を望んでいます。私は複数のdfコピーと複数のマージを単純化できると仮定します。

import pandas as pd 
df = pd.DataFrame({ 
    "Child Name" : ["Peter","James","Liz","Paul","Shirly","Eva"], 
    "Child Age" : ["5","15","2","6","11","9"], 
    "Father Name" : ["Richard","Doug","Doug","Richard","Charles","Chris"], 
    "Father Age" : ["40","45","45","40","33","29"] }) 

g2 = df.groupby(['Father Name'])["Child Name"].apply(list).reset_index() 
g3 = df.groupby(['Father Name'])["Child Age"].apply(list).reset_index() 
g4 = df[["Father Name", "Father Age"]].drop_duplicates() 

df2 = g2.merge(g4) 
df2 = df2.merge(g3) 
print(df2) 

出力:

Father Name  Child Name Father Age Child Age 
0  Charles  [Shirly]   33  [11] 
1  Chris   [Eva]   29  [9] 
2  Doug [James, Liz]   45 [15, 2] 
3  Richard [Peter, Paul]   40 [5, 6] 
+0

あなたの時間はありがとうエバン、これは、私はそれがjsonまたはリスト形式のいずれかのデータを作成しませんが、私が望む出力に近いです。 –

+0

ああ、持っています。リストを取得するのに十分な簡単な変更があります - 改訂されたコードを見てください:) – Evan

関連する問題