df = pd.DataFrame(
{'A': [1971,1971,1971,1970,1970,1972,1972,1972,1972,1973,1973,1973,1974],
'B': ['apple', 'apple', 'orange', 'banana', 'apple', 'mango', 'banana', 'orange', 'apple', 'banana', 'mango', 'apple', 'orange'],
'C': ['apple', 'apple', 'nan', 'nan', 'apple', 'mango', 'banana', 'orange', 'apple', 'nan', 'mango', 'nan', 'nan'],
})
fruits_by_year = df[df.C!='nan'].groupby('A')['C'].apply(set).to_dict()
def get_A_minus_n(x, n):
if x.A-n not in fruits_by_year:
return 'nan'
elif x.B in fruits_by_year[x.A-n]:
return 'yes'
else:
return 'no'
df['A-1'] = df.apply(lambda x: get_A_minus_n(x, 1), axis=1)
df['A-2'] = df.apply(lambda x: get_A_minus_n(x, 2), axis=1)
Давайте сначала создадим диктовку с именем fruits_by_year
:
отбросить строки, у которых 'C'
равно 'nan'
сгруппировать по столбцу 'A'
и получить их значения в столбце 'C'
преобразование значений в набор
преобразовать все результаты в диктовку
Должно быть:
{1970: {'apple'}, 1971: {'apple'}, 1972: {'apple', 'banana',
«манго», «апельсин»}, 1973: {«манго»}}
А затем создайте два новых столбца. Нам нужно:
построить функцию get_A_minus_n
, которая возвращает различное значение в 3 разных случаях
применить эту функцию к каждой строке DataFrame
Примечание: 9-й ряд 'A-1'
, 'A-2'
должен быть 'yes'
, 'yes'