在每个列的特定条件下对齐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))
找到每列的最大值:
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))
考虑一下Dataframe.apply
:
new_tmp = tmp.filter(regex="ZW").apply(lambda col: col.shift(125 - col.idxmax()))
print(new_tmp.equals(_))
# True