【问题标题】:Apply a function with multiple parameters in input in groupby pandas在 groupby pandas 的输入中应用具有多个参数的函数
【发布时间】:2021-01-11 22:47:31
【问题描述】:

我想将 Value1 列的 NaN 和 NaT 值替换为使用接受同一行 Value1 的输入 Value2 和 Value3(如果存在)的函数计算的其他值。这是针对每个 ID 完成的。为此,我会使用“groupby”,然后使用“apply”。但我得到一个错误:'Series' 对象是可变的,因此它们不能被散列。你可以帮帮我吗?提前致谢!

ID1 = [2002070, 2002070, 2002740,2002740,2003010]
ID2 = [2002070, 200800, 200800,2002740,2002740]
ID3 = [2002740, 2002740, 2002070, 2002070,2003010]
Value1 = [4.5, 4.2, 3.7, 4.8, 4.4]
Value2 = [7.2, 6.4, 10, 2.3, 1.5]
Value3 = [8.4, 8.4, 8.4, 7.4, 7.4]
date1 = ['2008-05-14', '2005-12-07','2008-10-27', '2009-04-20', '2012-03-01']
date2 = ['2005-12-07','2003-10-10', '2004-05-14', '2011-06-03', '2015-07-05']
date3 = ['2010-10-22', '2012-03-01', '2013-11-28', '2005-12-07', '2012-03-01']
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')
ok = df1.merge(df2, left_on=['ID','Date1'],right_on=['ID','Date2'], how='outer', sort=True)
ok1 = ok.merge(df3, left_on='ID',right_on='ID', how='inner', sort=True )

我得到的df是这样的:

      ID   Value1  Date1   Value2  Date2    Value3  Date3
0   2002070 4.2 2005-12-07  7.2 2005-12-07  7.4 2005-12-07
1   2002070 4.2 2005-12-07  7.2 2005-12-07  8.4 2013-11-28
2   2002070 4.5 2008-05-14  NaN     NaT     7.4 2005-12-07
3   2002070 4.5 2008-05-14  NaN     NaT     8.4 2013-11-28
4   2002740 3.7 2008-10-27  NaN     NaT     8.4 2010-10-22
5   2002740 3.7 2008-10-27  NaN     NaT     8.4 2012-03-01
6   2002740 4.8 2009-04-20  NaN     NaT     8.4 2010-10-22
7   2002740 4.8 2009-04-20  NaN     NaT     8.4 2012-03-01
8   2002740 NaN    NaT      2.3 2011-06-03  8.4 2010-10-22
9   2002740 NaN    NaT      2.3 2011-06-03  8.4 2012-03-01
10  2002740 NaN    NaT      1.5 2015-07-05  8.4 2010-10-22
11  2002740 NaN    NaT      1.5 2015-07-05  8.4 2012-03-01
12  2003010 4.4 2012-03-01  NaN     NaT     7.4 2012-03-01

这是我做的函数:

def func(Value2, Value3):
    return Value2/((Value3/100)**2)
result = ok1.groupby("ID").Value1.apply(func(ok1.Value2, ok1.Value3))

您知道如何将此函数仅应用于 NaN Value1 吗?以及如何让 NaT Date1 等于 Date2?

【问题讨论】:

  • 1.我正在尝试您的代码并收到错误“系列对象是可变的,因此它们不能被散列”。您能否更清楚地说明您要对 Value1 做什么?您是否要覆盖原始值?
  • 2.您可以使用df['Date1'].fillna(df['Date2']) 将一列 NA 替换为另一列
  • 1.是的,我想覆盖 Nan 值 2。是的,我正在寻找这个解决方案,谢谢

标签: python pandas


【解决方案1】:

func 的输出是另一个Series,pandas 不知道你想用它做什么——apply 这个系列对小组意味着什么?

您是否希望在原始DataFrame 中缺少Value1 的地方分配此系列的值?

这样的话


imputes = ok1.Value2.div(ok1.Value3.div(100).pow(2))  # same as your function

# overwrite missing values with the corresponding imputed values
ok1.Value1.fillna(imputes, inplace=True)

# overwrite missing dates with dates from another column
ok1.Date1.fillna(ok1.Date2, inplace=True)

但是,鉴于groupby 的存在,我不清楚这是否正是您想要的。

【讨论】:

  • 你是对的,groupby 不是最佳选择,考虑到我会用同一行的其他值替换该值,因此有关 ID 的信息不相关。你完美地抓住了这个问题,这对我来说是最好的解决方案。谢谢
猜你喜欢
  • 2020-12-07
  • 2022-09-23
  • 1970-01-01
  • 2013-11-14
  • 2017-10-05
  • 1970-01-01
  • 2020-04-21
  • 2015-04-25
  • 2021-06-19
相关资源
最近更新 更多