KeyError: 0 при попытке использовать DEF - PullRequest
0 голосов
/ 05 апреля 2020

Я здесь новичок, практикую python и не могу заставить это работать.

У меня есть DF с 6 столбцами и несколькими строками, все они dtype float64.

Я создал def , чтобы он делал это:

def completar_datos (var1,var2,var3,var4,var5,var6):
n = len(df5)
for i in range(n):
    if df5[var1][i]+df5[var2][i]+df5[var3][i] < 100 :
        df5[var4][i]= 100*df5[var1][i]/df5[var1][i]+df5[var2][i]+df5[var3][i]
        df5[var5][i]= 100*df5[var2][i]/df5[var1][i]+df5[var2][i]+df5[var3][i]
        df5[var6][i]= 100*df5[var3][i]/df5[var1][i]+df5[var2][i]+df5[var3][i]   

По сути, я хочу, чтобы для этого l oop, была выполнена эта операция и сохранена.

Но я получаю эту ошибку и не знаю, что делать:

KeyError                                  Traceback (most recent call last)
<ipython-input-22-dfad1d30cb75> in <module>
----> 1 completar_datos('Health_exp_out_of_pocket_pct_2016','Health_exp_public_pct_2016','External_health_exp_pct_2016','Health_exp_Out_Pocket','Health_exp_Public','External_Health_exp')

<ipython-input-21-c5a069ca4dca> in completar_datos(var1, var2, var3, var4, var5, var6)
      2     n = len(df5)
      3     for i in range(n):
----> 4         if df5[var1][i]+df5[var2][i]+df5[var3][i] < 100 :
      5             df5[var4][i]= 100*df5[var1][i]/df5[var1][i]+df5[var2][i]+df5[var3][i]
      6             df5[var5][i]= 100*df5[var2][i]/df5[var1][i]+df5[var2][i]+df5[var3][i]

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\series.py in __getitem__(self, key)
    869         key = com.apply_if_callable(key, self)
    870         try:
--> 871             result = self.index.get_value(self, key)
    872 
    873             if not is_scalar(result):

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_value(self, series, key)
   4402         k = self._convert_scalar_indexer(k, kind="getitem")
   4403         try:
-> 4404             return self._engine.get_value(s, k, tz=getattr(series.dtype, "tz", None))
   4405         except KeyError as e1:
   4406             if len(self) > 0 and (self.holds_integer() or self.is_boolean()):

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_value()

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_value()

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()

KeyError: 0

Есть идеи, как это исправить? Если вы не понимаете, пожалуйста, спросите меня, это мой первый пост.

СПАСИБО !!

1 Ответ

0 голосов
/ 05 апреля 2020

Вы не хотите, чтобы l oop над фреймом данных таким образом. Определите функцию и примените ее к столбцу или всему фрейму данных. Посмотрите подробности в документации pandas для apply.

Источник вашей ошибки, кажется, в том, что pandas ищет столбец с именем 0, и это имя не существует, поэтому он выдает KeyError. Вы пытаетесь использовать индексы массива на фрейме данных. Если вы хотите получить доступ к строкам и столбцам фрейма данных, используйте df.loc или df.iloc.

...