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

时间:2018-08-25 20:23:25

标签: python python-3.x pandas data-science

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

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)

任何建议将不胜感激。

2 个答案:

答案 0 :(得分: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 :(得分:-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