首页 > 解决方案 > 如何在 pandas 中使用 groupby 添加功能?

问题描述

我有这种表:

ID1 = [2002070, 2002070,2002070, 2002070, 2002070, 2002740,2002740,2002740,2003010,2003010]
ID2 = [2002070, 2002070,200800, 200800, 200800, 300540,300540,300540,2002740,2002740]
ID3 = [2002740, 2002740,2002740, 2002070, 2002070, 2002070,3000540,3000540,5001020,5001020]
Value1 = [4.5, 4.2, 3.7, 4.8, 4.4, 4.6, 3.3, 5.3, 3.8 ,2.6]
Value2 = [7.2, 6.4, 10, 2.3, 1.5, 4.7, 9.5, 4.2, 4.6 ,1.5]
Value3 = [8.4, 8.4, 8.4, 7.4, 7.4, 7.4, 5.3, 5.3, 6.1 ,6.1]
date1 = ['2005-12-07', '2008-05-14', '2008-10-27', '2009-04-20', '2012-03-01', '2013-11-28','2012-08-13', '2011-07-27', '2011-11-02', '2011-08-04']
date2 = ['2003-10-10', '2005-12-07', '2004-05-14', '2011-06-03', '2015-07-05', '2013-04-22','2002-01-14', '2005-04-12', '2011-06-26', '2004-10-18']
date3 = ['2010-10-22', '2012-03-01', '2013-11-28', '2005-12-07', '2012-03-01', '2009-04-20','2012-10-02', '2008-01-30', '2006-08-09', '2006-02-12']
date1=pd.to_datetime(date1)
date2=pd.to_datetime(date2)
date3=pd.to_datetime(date3)
df1=pd.DataFrame({'ID': ID1, 'Value1': Value1, 'Date1':date1}).sort_values('Date1')
df2=pd.DataFrame({'ID': ID2, 'Value2': Value2, 'Date2':date2}).sort_values('Date2')
df3=pd.DataFrame({'ID': ID3, 'Value3': Value3, 'Date3':date3}).sort_values('Date3')


        ID  Value1  Date1         ID    Value2  Date2         ID    Value3  Date3
0   2002070 4.5 2005-12-07      2002070 7.2 2003-10-10      2002740 8.4 2010-10-22
1   2002070 4.2 2008-05-14      2002070 6.4 2005-12-07      2002740 8.4 2012-03-01
2   2002070 3.7 2008-10-27       200800 10  2004-05-14      2002740 8.4 2013-11-28
3   2002070 4.8 2009-04-20       200800 2.3 2011-06-03      2002070 7.4 2005-12-07
4   2002070 4.4 2012-03-01       200800 1.5 2015-07-05      2002070 7.4 2012-03-01
5   2002740 4.6 2013-11-28       300540 4.7 2013-04-22      2002070 7.4 2009-04-20
6   2002740 3.3 2012-08-13       300540 9.5 2002-01-14      3000540 5.3 2012-10-02
7   2002740 5.3 2011-07-27       300540 4.2 2005-04-12      3000540 5.3 2008-01-30
8   2003010 3.8 2011-11-02      2002740 4.6 2011-06-26      5001020 6.1 2006-08-09
9   2003010 2.6 2011-08-04      2002740 1.5 2004-10-18      5001020 6.1 2006-02-12

我想做这些步骤:

  1. 比较 ID1、ID2 和 ID3 是否相等
  2. 如果 date1 和 date2 不同并且 value2 和 value3(对于任何 date3,但对于 ID3=ID2=ID1)存在且 value1 不存在
  3. 然后计算 ID3=ID2=ID1(对于任何 date3,date3 不相关)value1_new=value2/(value3^2) 并为 value1_new 设置 date1_new=date2。

例如,考虑 ID=2002070,唯一与 Date1 不同的 Date2 是 Date2.iloc[0],所以我将得到 Value1_new=value2.iloc[0]/(value3.iloc[3]^2) 和 Date1_new1=Date2。 iloc[0]。然后我会将这个新值附加到 pedices 1 指示的列中。对于 Date2.iloc[1],我将保留 Value1.iloc[0],所以我什么都不做

可能我应该使用 groupby('ID'),但是我不知道如何将最后两个步骤集成到 groupby 函数中。你知道一些熊猫功能来做这些吗?或者我应该使用 for 循环?

标签: pythonpandas

解决方案


推荐阅读