Умножьте столбцы в кадре данных, получая имена столбцов из списка - PullRequest
2 голосов
/ 07 марта 2019

У меня есть фрейм данных, в котором у меня есть как категориальные, так и числовые столбцы.

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 при умноженииотрицательно или нет

Как это можно сделать в пандах? Я не могу понять, как перебрать список 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

Ответы [ 3 ]

3 голосов
/ 07 марта 2019

Используйте numpy.where с условием 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  
3 голосов
/ 07 марта 2019

Вы можете использовать df.filter() для фильтрации столбцов, имеющих Total (аналогично вашему cols_list), а затем использовать df.prod() более 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 
1 голос
/ 07 марта 2019

Попробуйте это:

df['Negative'] = df[cols_list].T.product().apply(lambda x: x < 0)

df[cols_list].T там транспонирует столбцы в строки.Таким образом, мы можем взять product для строк (что панды позволяют нам сделать с помощью одного вызова функции).

Пошагово:

>>> 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...