将Pandas DataFrame中的行与每列的最大值对齐

问题描述 投票:1回答:1

在每个列的特定条件下对齐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

python pandas
1个回答
1
投票

考虑一下Dataframe.apply

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

print(new_tmp.equals(_))
# True
© www.soinside.com 2019 - 2024. All rights reserved.