Pandas:将函数应用于特定的行值和索引

问题描述 投票:0回答:2

我正在尝试编写一个函数来计算新列中的新变量。我有一个数据集,可以在很多天内跟踪几个主题的变量。

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)

任何建议将不胜感激。

python python-3.x pandas data-science
2个回答
0
投票

这应该这样做:

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,基于你的公式!


-1
投票

如果要排除第一行,然后:

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
© www.soinside.com 2019 - 2024. All rights reserved.