Ошибка IndexEr при замене пропущенных значений режимом с использованием группового режима в пандах - PullRequest
0 голосов
/ 01 января 2019

У меня есть набор данных, который требует обработки пропущенного значения.

 Column                      Missing Values

 Complaint_ID                    0         
 Date_received                   0         
 Transaction_Type                0         
 Complaint_reason                0         
 Company_response              22506         
 Date_sent_to_company            0         
 Complaint_Status                0         
 Consumer_disputes             7698

Теперь проблема заключается в том, что когда я пытаюсь заменить отсутствующий values на режим другого columns, используя groupby:

Код:

data11["Company_response"] = 
data11.groupby("Complaint_reason").transform(lambda x: x.fillna(x.mode() 
[0]))["Company_response"]

data11["Consumer_disputes"] = 
data11.groupby("Transaction_Type").transform(lambda x: x.fillna(x.mode() 
[0]))["Consumer_disputes"]

Я получаю следующую ошибку:

Stacktrace

Traceback (most recent call last):

File "<ipython-input-89-8de6a010a299>", line 1, in <module>
    data11["Company_response"] = data11.groupby("Complaint_reason").transform(lambda x: x.fillna(x.mode()[0]))["Company_response"]

  File "C:\Anaconda3\lib\site-packages\pandas\core\groupby.py", line 3741, in transform
    return self._transform_general(func, *args, **kwargs)

  File "C:\Anaconda3\lib\site-packages\pandas\core\groupby.py", line 3699, in _transform_general
    res = path(group)

  File "C:\Anaconda3\lib\site-packages\pandas\core\groupby.py", line 3783, in <lambda>
    lambda x: func(x, *args, **kwargs), axis=self.axis)

  File "C:\Anaconda3\lib\site-packages\pandas\core\frame.py", line 4360, in apply
    ignore_failures=ignore_failures)

  File "C:\Anaconda3\lib\site-packages\pandas\core\frame.py", line 4456, in _apply_standard
    results[i] = func(v)

  File "C:\Anaconda3\lib\site-packages\pandas\core\groupby.py", line 3783, in <lambda>
    lambda x: func(x, *args, **kwargs), axis=self.axis)

  File "<ipython-input-89-8de6a010a299>", line 1, in <lambda>
    data11["Company_response"] = data11.groupby("Complaint_reason").transform(lambda x: x.fillna(x.mode()[0]))["Company_response"]

  File "C:\Anaconda3\lib\site-packages\pandas\core\series.py", line 601, in __getitem__
    result = self.index.get_value(self, key)

  File "C:\Anaconda3\lib\site-packages\pandas\core\indexes\base.py", line 2434, in get_value
    return libts.get_value_box(s, key)

  File "pandas\_libs\tslib.pyx", line 923, in pandas._libs.tslib.get_value_box (pandas\_libs\tslib.c:18843)

  File "pandas\_libs\tslib.pyx", line 939, in pandas._libs.tslib.get_value_box (pandas\_libs\tslib.c:18560)

IndexError: ('index out of bounds', 'occurred at index Consumer_disputes')

Я проверил length из dataframeи все его столбцы, и это то же самое: 43266.

Я также нашел вопрос, подобный этому, но не имеет правильного ответа: Нажмите здесь

Пожалуйста, помогитеустраните ошибку.

IndexError: ('index out of bounds', 'произошел в index Consumer_disputes')

Вот снимок набора данных, если он помогает влюбым способом: Снимок набора данных

Я успешно использую приведенный ниже код.Но это не служит моей цели точно.Помогает заполнить пропущенные значения.

data11['Company_response'].fillna(data11['Company_response'].mode()[0], 
inplace=True)
data11['Consumer_disputes'].fillna(data11['Consumer_disputes'].mode()[0], 
inplace=True)

Edit1: (Прикрепление образца)

Входные данные: InputImage

Ожидаемый результат:OutputImage

Вы можете видеть, что пропущенные значения для ответа компании Tr-1 и Tr-3 заполняются при использовании режима Жалоба-Причина.И аналогично для Потребительских споров, используя режим типа транзакции, для Tr-5.

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

Код репликации

import pandas as pd
import numpy as np

data11=pd.DataFrame({'Complaint_ID':['Tr-1','Tr-2','Tr-3','Tr-4','Tr-5','Tr-6'],
                    'Transaction_Type':['Mortgage','Credit card','Bank account or service','Debt collection','Credit card','Mortgage'],
                    'Complaint_reason':['Loan servicing, payments, escrow account','Incorrect information on credit report',"Cont'd attempts collect debt not owed","Cont'd attempts collect debt not owed",'Payoff process','Loan servicing, payments, escrow account'],
                    'Company_response':[np.nan,'Company chooses not to provide a public response',np.nan,'Company believes it acted appropriately as authorized by contract or law','Company has responded to the consumer and the CFPB and chooses not to provide a public response','Company disputes the facts presented in the complaint'],
                    'Consumer_disputes':['Yes','No','No','No',np.nan,'Yes']})

data11.isnull().sum()

data11["Company_response"] = data11.groupby("Complaint_reason").transform(lambda x: x.fillna(x.mode()[0]))["Company_response"]
data11["Consumer_disputes"] = data11.groupby("Transaction_Type").transform(lambda x: x.fillna(x.mode()[0]))["Consumer_disputes"]    

Ответы [ 3 ]

0 голосов
/ 01 января 2019

Попробуйте:

data11["Company_response"] = data11.groupby("Complaint_reason")['Company_response'].transform(lambda x: x.fillna(x.mode()[0]))

data11["Consumer_disputes"] = data11.groupby("Transaction_Type")['Consumer_disputes'].transform(lambda x: x.fillna(x.mode()[0]))  
0 голосов
/ 02 января 2019

@ Михаил Берлинков почти наверняка прав.Я смог воспроизвести вашу ошибку, а затем избежать ее, используя dropna():

data11.groupby("Transaction-Type").transform(
    lambda x: x.fillna(x.mode() [0]))["Consumer-disputes"]  
# Returns IndexError

data11.dropna().groupby("Transaction-Type").transform(
    lambda x: x.fillna(x.mode() [0]))["Consumer-disputes"]  
# Works
0 голосов
/ 01 января 2019

Ошибка возникает потому, что по крайней мере для одной из групп значения в соответствующих агрегированных столбцах содержат только значения np.nan.В этом случае pd.Series([np.nan]).mode() возвращает пустую серию, которая приводит к ошибке, когда вы берете первое значение.

Итак, вы можете использовать что-то вроде transform(lambda x: x.fillna(x.mode()[0] if not x.mode().empty else "Empty") ).

...