我正在尝试编写一个函数来计算新列中的新变量。我有一个数据集,可以在很多天内跟踪几个主题的变量。
Date Athlete Load
2016-01-04 Alan 180
2016-01-04 Ben 61
2016-01-04 David 186
2016-01-04 Joe 99
2016-01-04 John 131
我已经能够按名称过滤主题并为每个主题创建新的数据框。
for athlete in df['Athlete'].unique():
athlete = df.loc[ewma['Athlete'] == athlete]
print(athlete.head())
我遇到问题的部分是计算新列的公式。第一个值是根据第一个测量变量计算的,但每个后续值都使用前一天的值。
例如,新列的第一行将使用:
x = (df['Load'].iloc[0] * 2) - (df['Load'].iloc[0] / 2)
x = 180
第二行将使用前一天的值(x)代替第二个df ['Load']值。我能够使用基本函数正确计算第二个值:
y = (df['Load'].iloc[1] * 2) - (x / 2)
y = 168
我尝试使用'if / else',但它没有计算出正确的值。
if df.index.name == '0':
(df['Load'].iloc[0] * 2) - (df['Load'].iloc[0] / 2)
else:
(df['Load'] * 2) - (df['Load'].shitf(-1) / 2)
任何建议将不胜感激。
这应该这样做:
def update_row(df):
row_tmp = {"next_row": None}
def updater(row):
last_row_id = row.name - 1
if row.name == 0:
row_tmp['next_row'] = (row['Load'] * 2) - (row['Load'] /2.0)
return row_tmp['next_row']
row_tmp['next_row'] = (2* row['Load']) - (row_tmp['next_row']/2.0)
return row_tmp['next_row']
return updater
df
Date Athlete Load
0 2016-01-04 Alan 180
1 2016-01-04 Alan 0
2 2016-01-04 Alan 123
3 2016-01-04 Alan 71
4 2016-01-04 Alan 137
5 2016-01-04 Alan 0
6 2016-01-04 Alan 0
df.apply(update_row(df), axis=1)
0 270.00000
1 -135.00000
2 313.50000
3 -14.75000
4 281.37500
5 -140.68750
6 70.34375
dtype: float64
P.S.,我相信你对x和y的计算不准确,x应该是270,y应该是-13,基于你的公式!
如果要排除第一行,然后:
previous_row = next_row * 2 - previous_row/2
可以像这样实现:
"""
(row n-1) = (row n) * 2 - (row n-1) /2 except for row0.
"""
import pandas as pd
df = pd.read_csv('data.txt',delim_whitespace=True)
df['new'] = df.Load * 2 - df.Load.shift(1)/2
df.loc[0,'new'] = df.Load[0]
df
结果是:
Date Athlete Load new
0 2016-01-04 Alan 180 180.0
1 2016-01-04 Ben 61 32.0
2 2016-01-04 David 186 341.5
3 2016-01-04 Joe 99 105.0
4 2016-01-04 John 131 212.5