如何加入独立的数据帧并加入大熊猫?

时间:2017-12-03 15:09:19

标签: python pandas

实现这一目标的最佳方法是什么:

test = pd.DataFrame([2,3,4])
test1 = test.copy()
test2 = test.copy()
test1['start'] = 2017
test1['end'] = 2018
test2['start'] = 2018
test2['end'] = 2019
test = pd.concat([test1, test2])

具有以下结果:

        0   start   end
    0   2   2017    2018
    1   3   2017    2018
    2   4   2017    2018
    0   2   2018    2019
    1   3   2018    2019
    2   4   2018    2019

I think there will be a more elegant way ;)

更新(全图):

DataFrame1列:id,年份,值 DataFrame2列:开始,结束

结果:DataFrame1中每个id的id,start,end,avg值以及DataFrame2的每个开始/结束组合

data:

id  year    value
1   2016    -0,232
1   2017    -0,432
1   2018    -0,532
1   2019    -0,632
1   2020    -0,682
2   2016    0,768
2   2017    0,568
2   2018    0,468
2   2019    0,368
2   2020    0,318
2   2021    0,268

start   end
2017    2018
2017    2019
2018    2019

结果:

id  start   end avg_value
1   2017    2018    -0,48
1   2017    2019    -0,53
1   2018    2019    -0,58
2   2017    2018    0,52
2   2017    2019    0,47
2   2018    2019    0,42

最初的问题是建立结果数据框(作为没有avg_value的第一步)。它应该计算开始和结束“包含”的年份内的平均值。

1 个答案:

答案 0 :(得分:2)

首先使用交叉连接,然后使用自定义功能:

df1['value'] = df1['value'].replace(',','.', regex=True).astype(float)

def f(x):
    return df1.loc[df1['year'].between(x['start'], x['end']) & 
                  (df1['id'] == x['id']), 'value'].mean()

df = (pd.merge(df1[['id']].drop_duplicates().assign(a=1), df2.assign(a=1), on='a')
       .drop('a',1))
df['avg_value'] = df.apply(f, axis=1)
print (df)
   id  start   end  avg_value
0   1   2017  2018     -0.482
1   1   2017  2019     -0.532
2   1   2018  2019     -0.582
3   2   2017  2018      0.518
4   2   2017  2019      0.468
5   2   2018  2019      0.418