2017-07-21 7 views
1

パンダのデータフレームには、(a)名前(b)日付と(c)高さ(cm)の3つの列があります。高さは、異なる日付で異なる子供(名前)のために測定されます。特定の日付に各子供の身長を見ることができるように、Date列を区切りたいと思います。Python、パンダのデータを並べ替え

df = pd.DataFrame({ 
"Name": ["b", "c", "a", "b", "a", "c","a", "b", "c"], 
"Date": ["1", "1", "1", "2", "2", "2","3", "3", "3"], 
"Height": ["10", "11", "12", "11", "14", "13","15", "12", "14"] 

})

次のように表現することを望む:それを行うにはどのように enter image description here

例えば、 我々のデータは、このようなものですか?何をしたい

+0

はStackOverflowのへようこそ。この記事を読むには、[素晴らしいパンダの例を提供する方法](http://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples)と[最小限の、完全で検証可能な例を提供する](http:// stackoverflow。com/help/mcve)を編集し、それに応じて質問を修正してください。良い質問をする方法(http://stackoverflow.com/help/how-to-ask)も役立つかもしれません。 – jezrael

+0

が編集されました。チェックしてください。 –

答えて

1

あなたがリシェイプためpivotまたはset_index + unstackを使用する必要があります。

df1 = df.pivot(index='Name', columns='Date', values='Height') 
print (df1) 
Date 1 2 3 
Name    
a  12 14 15 
b  10 11 12 
c  11 13 14 

df1 = df.set_index(['Name', 'Date'])['Height'].unstack(fill_value=0) 
print (df1) 
Date 1 2 3 
Name    
a  12 14 15 
b  10 11 12 
c  11 13 14 

しかし、取得した場合:

ValueError: Index contains duplicate entries, cannot reshape

が列の重複が新しいインデックスと列を作成します:得れば

:しかし

df = pd.DataFrame({ 
"Name": ["b", "b", "a", "b", "a", "c","a", "b", "c"], 
"Date": ["1", "1", "1", "2", "2", "2","3", "3", "3"], 
"Height": ["10", "11", "12", "11", "14", "13","15", "12", "14"] 
}) 
print (df) 
    Date Height Name 
0 1  10 b <-duplicate Date=1, Name=b 
1 1  11 b <-duplicate Date=1, Name=b 
2 1  12 a 
3 2  11 b 
4 2  14 a 
5 2  13 c 
6 3  15 a 
7 3  12 b 
8 3  14 c 

その後meanのようないくつかの集約関数とpivot_tablesumを必要とするか、groupby + aggregate function + unstackを使用

DataError: No numeric types to aggregate

集計の列番号Heightはnumではありませんエリック、そうintまたはfloatにキャストするためにastypeを使用します。列の場合

df['Height'] = df['Height'].astype(int) 

df1 = df.pivot_table(index='Name', 
        columns='Date', 
        values='Height', 
        aggfunc='mean', fill_value=0) 
print (df1) 
Date  1 2 3 
Name    
a  12.0 14 15 
b  10.5 11 12 
c  0.0 13 14 

df1 = df.groupby(['Name', 'Date'])['Height'].mean().unstack(fill_value=0) 
print (df1) 
Date  1  2  3 
Name     
a  12.0 14.0 15.0 
b  10.5 11.0 12.0 
c  0.0 13.0 14.0 

reset_index + rename_axisを追加します。

df1 = df1.reset_index().rename_axis(None, axis=1) 
print (df1) 
    Name  1  2  3 
0 a 12.0 14.0 15.0 
1 b 10.5 11.0 12.0 
2 c 0.0 13.0 14.0 
+0

ありがとうございます。 –

0

MultiIndexデータフレームである、あなたはそうのようなDFを持っていると言う:

df = pd.DataFrame({ 
    "Name": ["a", "b", "c", "a", "b", "c"], 
    "Date": ["1", "2", "3", "4", "5", "6"], 
    "Height": ["10", "15", "12", "14", "17", "13"] 
}) 

あなたが実際にそのために、名前と日付の両方にインデックスを設定できます

df.set_index(["Name", "Date"], inplace=True) 
このDFを生成する

:あなたが使用できるよう

ここ
  Height 
Name Date  
a 1  10 
b 2  15 
c 3  12 
a 4  14 
b 5  17 
c 6  13 

名前と日付の両方が、インデックスされています。 [名前]列にLOC、例えば、特定の名前の日付とハイツのDFを取得する:

df.loc["a"] 

収量:

 Height 
Date  
1  10 
4  14 
+0

質問を編集しました。チェックしてください。 –

関連する問題