#python #pandas #dataframe #conditional-statements
#python #pandas #фрейм данных #условные операторы
Вопрос:
Я вряд ли пытаюсь отфильтровать свой набор фреймов данных, используя .функция loc с условием, основанным на типе данных в одном из моих столбцов.
Моя цель — применить (с помощью .apply ) функцию к столбцу только к строкам с определенным типом.
Я пытался использовать «dtype», но в моем столбце есть значения с 2 разными типами. Итак, я получаю только «объект».
Итак, когда я делаю: print(df.info(verbose=True))
я получаю это:
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 address 26419 non-null object
.
.
.
Вот что я пытаюсь запустить:
import ipaddress as ipa
.
.
.
df.loc['EXCEPTION'] = df.loc[isinstance(df['address'], ipa.IPv4Network)].apply(
return_row_with_exception,
axis=1)
Предполагается, что он обновляет только столбец ‘EXCEPTION’ в фрейме данных ‘df’, только в строках, для которых данные в столбце ‘address’ имеют тип IPv4Network. Функция ‘return_row_with_exception’ возвращает строковое содержимое ‘EXCEPTION’ для каждой строки на основе правила, использующего другие столбцы строки.
К сожалению, я получаю эту ошибку, может кто-нибудь помочь мне в этом: D
Traceback (most recent call last):
File "pythonProject1111venvlibsite-packagespandascoreindexesbase.py", line 2895, in get_loc
return self._engine.get_loc(casted_key)
File "pandas_libsindex.pyx", line 70, in pandas._libs.index.IndexEngine.get_loc
File "pandas_libsindex.pyx", line 98, in pandas._libs.index.IndexEngine.get_loc
File "pandas_libsindex_class_helper.pxi", line 93, in pandas._libs.index.Int64Engine._check_type
KeyError: False
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "pythonProject1111main.py", line 14, in <module>
abc = lib_read_from_imap.process_abc(abc)
File "pythonProject1111libsread_from_abc.py", line 178, in process_abc
df_file_abc = scaexc.fill_scan_exception(df_file_abc)
File "pythonProject1111libsprocess_scan_exception.py", line 80, in fill_scan_exception
print(df.loc[isinstance(df['address'], ipa.IPv4Network)])
File "pythonProject1111venvlibsite-packagespandascoreindexing.py", line 879, in __getitem__
return self._getitem_axis(maybe_callable, axis=axis)
File "pythonProject1111venvlibsite-packagespandascoreindexing.py", line 1110, in _getitem_axis
return self._get_label(key, axis=axis)
File "pythonProject1111venvlibsite-packagespandascoreindexing.py", line 1059, in _get_label
return self.obj.xs(label, axis=axis)
File "pythonProject1111venvlibsite-packagespandascoregeneric.py", line 3491, in xs
loc = self.index.get_loc(key)
File "pythonProject1111venvlibsite-packagespandascoreindexesbase.py", line 2897, in get_loc
raise KeyError(key) from err
KeyError: False
Большое спасибо!!
Ответ №1:
Как вы упомянули, dtypes
работает, если у вас несколько типов. Вот что вы могли бы сделать вместо этого:
employees = [('jack', 34, 'Sydney', 155),
('Riti', 31, 'Delhi', 177.5),
('Aadi', 16, 'Mumbai', 81),
('Mohit', 31, 45, 167),
('Veena', 12, 'Delhi', 'Serge'),
('Shaunak', 35, 'Mumbai', 135),
('Shaun', 35, 'Colombo', 111)
]
empDfObj = pd.DataFrame(empoyees, columns=['Name', 'Age', 'City', 'Marks'])
empDfObj.applymap(type).apply(pd.value_counts).fillna(0)
где вы используете .apply
.
Предоставляя вам
Name Age City Marks
<class 'str'> 7.0 0.0 6.0 1
<class 'int'> 0.0 7.0 1.0 5
<class 'float'> 0.0 0.0 0.0 1
Вы даже получаете их количество 🙂