Дублирование столбцов и возможное уменьшение размерности Ошибка ключа 0 Ошибка Python

#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 🙂