2016-04-25 9 views
1

私はPandas(Pythonで)を使用してCSVからデータフレームとして読み込んでいます。 CSVは、次のように基本的になります。Pandasを使用して行データを列にピボットする

image img1.jpg 
date  Thursday, May 5 
link  bit.ly/asdf 
subject 'Unique subject line 1' 
image img2.jpg 
date  Tuesday, May 17 
link  bit.ly/zxcv 
subject 'Unique subject line 2' 
image img3.jpg 
date  Monday, May 9 
link  bit.ly/sdfg 
subject 'Unique subject line 3' 

私は現在列として1列に行データとして記載されている属性で、それぞれ独自のグループ化は、単一の行にあるデータフレームにそれを取得したいのですが名前。したがって、次のようなもの:

image  date     link   subject 
img1.jpg Thursday, May 5  bit.ly/asdf 'Unique subject line 1' 
img2.jpg Tuesday, May 17  bit.ly/zxcv 'Unique subject line 2' 
img3.jpg Monday, May 9  bit.ly/sdfg 'Unique subject line 3' 

私はpandas.pivot_tableを使用してみましたともちょうど私が欲しいの列を持つ空のデータフレームを作成しますが、両方の方法で、私は、インデックスまたは凝集のいずれかに問題を抱えています。これは、私がいずれかの属性でグループ化しているわけではないので、数値データを集計しようとしているわけではないと思います。

このようにデータを整形するのは簡単ではないようですが、私が望むグループをどのように定義するかはわかりません。 pivot_tableを使ってこれを行う方法はありますか、別の方法で行うのが最善でしょうか?

答えて

1

現在、データがフォーマットされているため、ピボット時に画像をグループ化する方法はありません。どの日付も各画像に対応する必要があるという追加のデータはないので、任意の日付をピボット時にimg1.jpgとグループ化することができます。

これを修正するには、グループ化情報を含む列を追加するだけです。出力によって判断すると、グループ化は本質的に行順になります。最初の4行が一緒になり、次の4行が一緒になります。このような繰り返しを列挙するには、numpy.repeatが便利です。イメージと属性の数を知るだけでよいのです。

# Add an grouping column. 
nbr_images = (df['col1'] == 'image').sum() 
nbr_attributes = len(df)/nbr_images 
df['image_group'] = np.repeat(range(nbr_images), nbr_attributes) 

さて、それはピボットに簡単です:いくつかの基本的な数学は、私たちがイメージと一般的な属性の数の数を取得することができます

# Pivot the DataFrame. 
pivoted_df = df.pivot(columns='col1', index='image_group', values='col2') 

# Clear the index and column name. 
pivoted_df.index.name = None 
pivoted_df.columns.name = None 

結果の出力:

   date  image   link    subject 
0 Thursday, May 5 img1.jpg bit.ly/asdf Unique subject line 1 
1 Tuesday, May 17 img2.jpg bit.ly/zxcv Unique subject line 2 
2 Monday, May 9 img3.jpg bit.ly/sdfg Unique subject line 3 
+0

優れた、ありがとう!同様に構造化されたデータを持つ他の人にとっては、df.pivot(columns = 0、values = 1、index = 'image_group')を使う必要がありました。 – nicolekanderson

0

私はあなたがimage_groupを作成するためにcumsumを使うことができると思います。そして、pivotrename_axispandasの新):

df['image_group'] = (df.col1 == 'image').cumsum() - 1 
print df.pivot(columns='col1', index='image_group', values='col2') 
     .rename_axis(None) 
     .rename_axis(None, axis=1) 

       date  image   link     subject 
0 Thursday, May 5 img1.jpg bit.ly/asdf 'Unique subject line 1' 
1 Tuesday, May 17 img2.jpg bit.ly/zxcv 'Unique subject line 2' 
2 Monday, May 9 img3.jpg bit.ly/sdfg 'Uniquesubject line 3' 

別の方法としては、1行を使用することができます。

print pd.pivot(columns=df['col1'], 
       index=(df.col1 == 'image').cumsum() - 1, 
       values=df['col2']) 
     .rename_axis(None) 
     .rename_axis(None, axis=1) 

       date  image   link     subject 
0 Thursday, May 5 img1.jpg bit.ly/asdf 'Unique subject line 1' 
1 Tuesday, May 17 img2.jpg bit.ly/zxcv 'Unique subject line 2' 
2 Monday, May 9 img3.jpg bit.ly/sdfg 'Uniquesubject line 3' 

EDIT:オリジナルデータフレームの列が選択するための01使用ilocある場合:

print pd.pivot(columns=df.iloc[:,0], 
       index=(df.iloc[:,0] == 'image').cumsum() - 1, 
       values=df.iloc[:,1]) 
     .rename_axis(None) 
     .rename_axis(None, axis=1) 

       date  image   link     subject 
0 Thursday, May 5 img1.jpg bit.ly/asdf 'Unique subject line 1' 
1 Tuesday, May 17 img2.jpg bit.ly/zxcv 'Unique subject line 2' 
2 Monday, May 9 img3.jpg bit.ly/sdfg 'Uniquesubject line 3' 
関連する問題