我有一些功能和相应年份的数据框。功能的每个值都列出了不同的年份。我需要将特定年份的值与该7年之前的值进行比较。因此,基本上我需要定义一个函数,该函数将生成两列,一个将为我提供表中特定年份的功能值,而另一个为相同功能但早于7年的值。我怎样才能做到这一点?
feature year
value1 2001
value1 2008
vlaue2 1996
等
例如我想将value1(2008)
与value1(2008 - 7)
等进行比较。
还应该有一些条件语句,因为不能将2000年与(2000-7 = 1993)进行比较,例如,对于该年份(1993)没有任何价值。
答案 0 :(得分:0)
根据您对问题的了解,这是一个快速的解决方案
import numpy as np
import pandas as pd
data = {'feature': ['A', 'B', 'C', 'A'],
'value': [1, 10, 3, 50],
'year':[2001, 2002, 2003, 2008]}
df = pd.DataFrame(data)
def compFeature(df, f, y):
if df[(df.feature == f) & (df.year == (y-7))].year is not None:
now = df[(df.feature == f) & (df.year == y)].value
old = df[(df.feature == f) & (df.year == (y-7))].value
result = np.subtract(now,old)
else:
result = np.nan
return result
这只是让您入门。
答案 1 :(得分:0)
使用您提供的最少信息,可以将其用作解决方案:
如果有的话,让我们创建一个获取两年数据的函数。
def compare(x):
f1 = df.loc[df['year'] == x, 'feature'].values[0]
y2 = x - 7
if y2 in df['year'].unique():
f2 = df.loc[df['year'] == y2, 'feature'].values[0]
return (x, f1, y2, f2)
else:
pass
将该函数应用于Year列并分配一个新的数据框名称。
foo = df['year'].apply(compare)
在foo中创建一个非空值的数据框:
bar = pd.DataFrame(data = list(foo.loc[~foo.isnull()]), columns = ['f1', 'y1', 'f2', 'y2'])
这将导致四列以便于比较。我了解您正在寻找两列解决方案,但四列解决方案彼此之间具有比较数据,这对于以后的使用也很有意义。