2017-12-26 15 views
1

Pandas DataFrameの行を、最大のような各列の特定の条件で整列する最も効率的な方法は何ですか?各列の最大値でのPandas DataFrameの行の整列

ここでは、各列の最大値を見つけた後に手動で列をシフトする例を示しますが、より簡単で効率的な方法があることを期待しています。アライメント前

tmp = yearly_data_scaled.filter(regex="ZW") # DataFrame to align 
tmp.describe() 
  ZW_2013  ZW_2014  ZW_2015  ZW_2016  ZW_2017 
count 251.000000 251.000000 251.000000 251.000000 247.000000 
mean  0.864789 0.803246 0.825631 0.843604 0.806205 
std  0.053225 0.090301 0.047080 0.068289 0.049530 
min  0.758926 0.647762 0.736072 0.701984 0.716466 
25%  0.821169 0.734540 0.795039 0.783745 0.779140 
50%  0.866351 0.791254 0.818219 0.831156 0.794635 
75%  0.891943 0.866758 0.847499 0.904693 0.819380 
max  1.000000 1.000000 1.000000 1.000000 1.000000 

プロット:

_ = tmp.plot(figsize=(20, 15)) 

Before Alignment

各列の最大値を検索します。

手動
max_list = [] 
for i in range(num_years): 
    max_idx = tmp['ZW_' + str(start_year + i)].idxmax() 
    max_list.append(max_idx) 
print('Index of the maximum for each column = ' + str(max_list) + '\n') 
Index of the maximum for each column = [12, 85, 123, 108, 126] 

それらは指数125(約グラフの水平方向の中央)とプロットを揃えるように、各列をシフト:

_ = pd.concat([tmp['ZW_2013'].shift(125-max_list[0]), 
       tmp['ZW_2014'].shift(125-max_list[1]), 
       tmp['ZW_2015'].shift(125-max_list[2]), 
       tmp['ZW_2016'].shift(125-max_list[3]), 
       tmp['ZW_2017'].shift(125-max_list[4])], axis=1).plot(figsize=(20, 15)) 

enter image description here

+0

あなたは今のところ – Wen

答えて

1

考えてみましょうDataframe.apply

new_tmp = tmp.filter(regex="ZW").apply(lambda col: col.shift(125 - col.idxmax())) 

print(new_tmp.equals(_)) 
# True 
+0

だけでなくループのために使用することを検討することができ、私は努力の価値がある良い答えを考えることはできません。素晴らしい答え! – piRSquared

+0

はい、これは素晴らしい答えです!まさに私が探していたもの。ありがとうございました! –

+0

@piRSquared ...私は何とかパンダの達人に感銘を受けましたか?間違いなく私は最初に答えたばかりだった。ハッピーホリデー! – Parfait

関連する問題