2016-11-24 273 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

您可以使用groupbyunstack

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 1 2 3 4 Nan Nan – Greg

+0

是的,您可以將'np.sort'添加到'return(pd.DataFrame(np.sort(x.values.ravel()) ))' – 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',我認爲它是bug – jezrael