#python #pandas
#python #pandas
Вопрос:
Я хотел бы заменить значения NaN и NaT столбца Value1 другими, вычисляемыми с помощью функции, которая принимает входные значения2 и Значение3 (если они существуют) из одной и той же строки Значения1. Это делается для каждого идентификатора. Для этого я бы использовал ‘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 значению1? И как поставить NaT Date1 равным Date2?
Комментарии:
1. 1. Я пробую ваш код и получаю сообщение об ошибке «Объекты серии изменчивы, поэтому их нельзя хэшировать» . Можете ли вы более четко объяснить, что вы пытаетесь сделать со значением 1? Вы пытаетесь перезаписать исходное значение?
2. 2. Вы можете заменить столбец NA другим столбцом, используя
df['Date1'].fillna(df['Date2'])
3. 1. Да, я хотел бы перезаписать значение Nan 2. да, я искал это решение, спасибо
Ответ №1:
Вывод func
другой Series
, и pandas не уверен, что вы хотите с ним сделать — что это будет означать для apply
этой серии для групп?
Вы хотите, чтобы значения этой серии присваивались везде Value1
, где в оригинале отсутствует DataFrame
значение?
В этом случае
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
.
Комментарии:
1. вы правы, groupby был не лучшим выбором, учитывая, что я бы заменил значение другими из той же строки, поэтому информация об идентификаторе не имеет значения. Вы отлично поняли проблему, для меня это лучшее решение. Спасибо