一个选项是pivot:
new_df = df.pivot(index='id', columns='period', values='score')
new_df:
period end mid_1 start
id
1 10.0 NaN 5.0
2 10.0 7.0 2.0
然后可以在end 和start 列上按行完成计算:
out = (
(((new_df['end'] - new_df['start']) / new_df['start']) * 100)
.map('{:.0f}%'.format)
.reset_index(name='change_in_score_start_to_end')
)
out:
id change_in_score_start_to_end
0 1 100%
1 2 400%
完整的工作示例:
import pandas as pd
df = pd.DataFrame({
'id': [1, 1, 2, 2, 2],
'date': ['2015-01-01', '2015-01-15', '2015-01-01', '2015-01-07',
'2015-01-14'],
'period': ['start', 'end', 'start', 'mid_1', 'end'],
'score': [5, 10, 2, 7, 10]
})
new_df = df.pivot(index='id', columns='period', values='score')
out = (
(((new_df['end'] - new_df['start']) / new_df['start']) * 100)
.map('{:.0f}%'.format)
.reset_index(name='change_in_score_start_to_end')
)
print(out)