#python-3.x #pandas #dataframe
#python-3.x #pandas #фрейм данных
Вопрос:
У меня есть фрейм данных, в котором у меня есть категориальные, а также числовые столбцы.
data = [['A',"India",10,20,30,15,"Cochin"],['B',"India",10,20,30,40,"Chennai"],['C',"India",10,20,30,15,"Chennai"]]
df = pd.DataFrame(data,columns=['Product','Country',"2016 Total","2017 Total","2018 Total","2019 Total","Region"])
Product Country 2016 Total 2017 Total 2018 Total 2019 Total Region
0 A India 10 20 30 15 Cochin
1 B India 10 20 30 40 Chennai
2 C India 10 20 30 15 Chennai
Я знаю, какими будут имена столбца числовых переменных (которые необходимо записывать динамически):
start_year = 2016
current_year = datetime.datetime.now().year
previous_year = current_year - 1
print(current_year)
year_list = np.arange(start_year, current_year 1, 1)
cols_list = []
for i in year_list:
if i <= current_year:
cols = str(i) " Total"
cols_list.append(cols)
cols_list
[‘Всего за 2016 год’, ‘Всего за 2017 год’, ‘Всего за 2018 год’, ‘Всего за 2019 год’]
Я пытаюсь определить, являются ли значения в столбцах cols_list при умножении отрицательными или нет
Как это можно сделать в pandas? Я не могу понять, как перебирать cols_list и извлекать столбцы из фрейма данных и умножать
Ожидаемый результат:
Product Country 2016 Total 2017 Total 2018 Total 2019 Total Region Negative
0 A India 10 20 30 15 Cochin No
1 B India 10 20 30 40 Chennai No
2 C India 10 20 30 15 Chennai No
Ответ №1:
Используйте numpy.where
с условием by DataFrame.prod
и Series.lt
для <0
:
#solution with f-strings for get cols_list by year arange
cols_list = [f'{x} Total' for x in np.arange(start_year, current_year 1)]
print (cols_list)
['2016 Total', '2017 Total', '2018 Total', '2019 Total']
df['Negative'] = np.where(df[cols_list].prod(axis=1).lt(0), 'Yes', 'No')
print (df)
Product Country 2016 Total 2017 Total 2018 Total 2019 Total Region
0 A India 10 20 30 15 Cochin
1 B India 10 20 30 40 Chennai
2 C India 10 20 30 15 Chennai
Negative
0 No
1 No
2 No
Ответ №2:
Вы можете использовать df.filter()
для фильтрации столбцов, имеющих Total
(аналогичный вашему результат cols_list
), а затем использовать df.prod()
over axis=1
, затем s.map()
:
df['Negative']=df.filter(like='Total').prod(axis=1).lt(0).map({True:'Yes',False:'No'})
print(df)
Product Country 2016 Total 2017 Total 2018 Total 2019 Total Region
0 A India 10 20 30 15 Cochin
1 B India 10 20 30 40 Chennai
2 C India 10 20 30 15 Chennai
Negative
0 No
1 No
2 No
Ответ №3:
Попробуйте это:
df['Negative'] = df[cols_list].T.product().apply(lambda x: x < 0)
df[cols_list].T
Там транспонирует столбцы в строки. Таким образом, мы можем использовать product
для строк (что pandas позволяет нам делать с помощью одного вызова функции).
Шаг за шагом:
>>> t = df[cols_list].T
>>> t
0 1 2
2016 10 10 10
2017 20 20 20
2018 30 30 30
>>> p = t.product()
>>> p
0 6000
1 6000
2 6000
dtype: int64
>>> neg = p.apply(lambda x: x < 0)
>>> neg
0 False
1 False
2 False
dtype: bool