2016-11-24 42 views
1

これは私の例のデータフレームれる:PythonのパンダGROUPBY /追加列

Index Param1 Param2 
    A  1  2 
    A  3  4 
    B  1  3 
    B  4  Nan 
    C  2  4 
私が取得したいと思い何

は次のとおりです。

Index Param1 Param2 Param3 Param4 
    A  1  2  3  4 
    B  1  3  4 
    C  2  4 

パンダを使用してそれを達成するための最良の方法だろうか? ご協力いただきありがとうございます。

答えて

1

あなたはunstackgroupbyを使用することができます。

def f(x): 
    return (pd.DataFrame(np.sort(x.values.ravel()))) 

df = df.groupby('Index')['Param1','Param2'].apply(f).unstack() 
df.columns = df.columns.droplevel(0) 
print (df) 
     0 1  2  3 
Index     
A  1 2  3  4 
B  1 3  4 Nan 
C  2 4 None None 

ために使用Series取得する場合:

TypeError: Series.name must be a hashable type

cumcountのもう一つの解決策:

df = df.set_index('Index').stack().reset_index(name='vals') 
df['g'] = 'Param' + df.groupby('Index').cumcount().add(1).astype(str) 
df = df.pivot(index='Index', columns='g', values='vals') 
print (df) 
g  Param1 Param2 Param3 Param4 
Index         
A   1.0  2.0  3.0  4.0 
B   1.0  3.0  4.0  NaN 
C   2.0  4.0  NaN  NaN 
+0

ありがとう!どちらの方法も一般的に動作しますが、私の実際のデータではデータフレームの途中に多くのNaNがあります。 「左に動かす」という方法がありますか?例行A 1 Nan 2 3 Nan 4、A 2 3 4 Nanに変更 – Greg

+0

はい、 'return(pd.DataFrame(n.values.ravel())に' np.sort'を追加できます)) ' – jezrael

1
import numpy as np 
import pandas as pd 

df = pd.DataFrame({'Index': ['A', 'A', 'B', 'B', 'C'], 'Param1': [1, 3, 1, 4, 2], 
        'Param2': [2, 4, 3, np.nan, 4]}).set_index('Index') 
print(df) 

#  Param1 Param2 
# Index     
# A   1  2.0 
# A   3  4.0 
# B   1  3.0 
# B   4  NaN 
# C   2  4.0 

def fn(g): 
    return pd.Series(g.values.ravel()) 

res = df.groupby(df.index).apply(fn).unstack() 
res.columns = ['Param1', 'Param2', 'Param3', 'Param4'] 
print(res) 

#  Param1 Param2 Param3 Param4 
# Index         
# A   1.0  2.0  3.0  4.0 
# B   1.0  3.0  4.0  NaN 
# C   2.0  4.0  NaN  NaN 
+0

うん、あなたのパンダのバージョンは何ですか?私には 'TypeError:Series.nameはハッシュ可能な型でなければなりません.' – jezrael

+0

@jezrael:私は0.19.0です。 –

+0

私は' 0.19.1'を使用しています。それはバグだと思います – jezrael