从相同的数据框中选择不同年份的值

时间:2018-10-01 23:40:13

标签: python pandas

我有一些功能和相应年份的数据框。功能的每个值都列出了不同的年份。我需要将特定年份的值与该7年之前的值进行比较。因此,基本上我需要定义一个函数,该函数将生成两列,一个将为我提供表中特定年份的功能值,而另一个为相同功能但早于7年的值。我怎样才能做到这一点?

feature    year
value1     2001
value1     2008  
vlaue2     1996 

例如我想将value1(2008)value1(2008 - 7)等进行比较。 还应该有一些条件语句,因为不能将2000年与(2000-7 = 1993)进行比较,例如,对于该年份(1993)没有任何价值。

2 个答案:

答案 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'])

这将导致四列以便于比较。我了解您正在寻找两列解决方案,但四列解决方案彼此之间具有比较数据,这对于以后的使用也很有意义。