#python #pandas #dataframe
Вопрос:
У меня есть следующий набор данных:
итак, как вы можете видеть, форма такова: 21 строка х 50 столбцов
Поэтому я хотел бы применить следующее условие:
Если какая-либо строка из «defaultstore»= 1, то столбец «FinalSL» получит в 4 раза большее значение, чем содержит столбец «FCST:ВСЕГО».
Поэтому я создаю функцию follow для выполнения этого вычисления:
def SLFinal(defaultStore, fcst):
if (defaultStore==1):
return (fcst*4)
else:
return 2
SLFinal(DFstore.iloc[i],FcstList.iloc[i])
Функция работает, но я хотел бы применить ее в своем наборе данных, поэтому я создаю следующие циклы для запуска каждой строки и хранения данных для столбцов «defaultstore» и «FCST:ВСЕГО».:
Fcst = copiedData.iloc[:,45:46]
FcstList = []
lenOfRows2 = len(copiedData)
for i in range(0, lenOfRows2):
FcstList.append(Fcst.loc[i])
DFstoreList`DFstore = copiedData.iloc[:,46:47]
DFstore
DFstoreList = []
lenOfRows2 = len(copiedData)
for i in range(0, lenOfRows2):
DFstoreList.append(DFstore.loc[i])
И, наконец, новый список, который будет содержать значения после применения функции:
FinalSLlist1 = []
for i in range(0, lenOfRows2 ):
Rows = []
for j in range(45, 50):
Rows.append( SLFinal(DFstore[i],FcstList[i]) )
FinalSLlist1.append(Rows)
Но происходит ошибка folloow:
---------------------------------------------------------------------------
`KeyError Traceback (most recent call last)
2693 # get column
2694 if self.columns.is_unique:
-> 2695 return self._get_item_cache(key)
2696
2697 # duplicate columns amp; possible reduce dimensionality`
KeyError: 0
Что мне делать ?
Ответ №1:
Вы можете использовать логическую индексацию и избегать любых циклов, подобных этому:
df.loc[df.defaultstore==1, 'FCST:TOTAL'] *= 4
df.loc[df.defaultstore!=1, 'FCST:TOTAL'] = 2
Возможно, было бы полезно ознакомиться с документацией pandas по логическому индексированию.
Ответ №2:
import pandas as pd
Просто используйте apply()
метод:
df['FCST:TOTAL']=df.apply(lambda x:x['FCST:TOTAL']*4 if (x['defaultstore']==1) else 2,1)
или
Если вы знакомы с numpy
этим, используйте where()
метод, так как он более эффективен, чем pandas
apply()
метод:
import numpy as np
df['FCST:TOTAL']=np.where(df['defaultstore']==1,df['FCST:TOTAL']*4,2)
Комментарии:
1.
apply
в основном зацикливается на строках, так что, на мой взгляд, это не лучшая практика.2. да, это не очень эффективно(с точки зрения скорости) для больших данных…. Я думал использовать
where()
метод numpy, но OP не использует numpy, поэтому я не считаю, что OP знает обnumpy
этом …но добавил это в ответ… thnx 🙂