2016-08-23 4 views
3

私は2つの列を結合しようとしています(YearとQuarter)。私は、SQLからデータを引き出し、下図のようにそれを旋回していますピボットされたDataframeで2つの列を結合します。

df3 = pd.pivot_table(df, index=["Year", "Q"], columns='Area', values="Lows", aggfunc=np.sum, fill_value=0) 

私は今、チャート上の目的のために一緒に列YearQに参加したいと思いますが、私のインデックスはめちゃめちゃているように見えます。以下は、データフレームの表示方法です。

Before: 
Year Q 
2003 1 
     2 
     3 
     4 
2004 1 
     2 

Desired output: 
Period 
2003 1 
2003 2 
2003 3 
2003 4 

答えて

1

これは動作するはずです:

df3.index = df3.index.to_series().apply(lambda x: ' '.join([str(y) for y in x])) 

より一般

join = lambda x, delim=' ': delim.join([str(y) for y in x]) 

df3.index = df3.index.to_series().apply(join, delim=' ') 
+0

となりました私は1つの新しい列を "NaN"までいっぱいまで持っています – spacedinosaur10

+0

@ spacedinosaur10私はそれを無視しましたeseは整数でした。私はそれを修正しました。 – piRSquared

0

別速く解決策:

df.index = ['{} {}'.format(idx[1], idx[0]) for idx in df.index] 

df.index = [' '.join((str(idx[0]), str(idx[1]))) for idx in df.index] 

タイミング

In [190]: %timeit df.index.to_series().apply(lambda x: ' '.join([str(y) for y in x])) 
10 loops, best of 3: 44.5 ms per loop 

In [191]: %timeit [' '.join((str(idx[0]), str(idx[1]))) for idx in df.index] 
10 loops, best of 3: 26.6 ms per loop 

In [192]: %timeit ['{} {}'.format(idx[1], idx[0]) for idx in df.index] 
100 loops, best of 3: 19.2 ms per loop 

コードタイミング用:

df = pd.DataFrame({'A':[2,2,2,1,7,2], 
        'B':[5,5,5,4,7,4], 
        'C':[7,8,9,4,8,1]}) 

df = df.groupby(['A','B']).sum() 
df = pd.concat([df]*10000) 
print (df) 
私は私の年と四半期の列が削除されたとしてそれが何をしたかわからない
+0

@piRSquaredこれは非常に役に立ちました。ありがとうございました。新しい結合カラムに名前を付ける方法はありますか?だからグラフを描くときに呼び出すことができますか? – spacedinosaur10

+0

自分のニーズに合ったdf3.index = df3 ['Period']を設定して、 'Period'という新しい列を作成しました。しかし、誰かが名前を付けられた行をリネームできるかどうかを知ることはいいでしょう。 – spacedinosaur10

+1

カラム名を変更する必要がある場合は、 'df3 = df3.rename(columns = {'Period': 'newname'})'を使用できます。必要なリセットインデックスが 'df3 = df3.reset_index()'を使用する場合 – jezrael

関連する問題