Сравните столбцы фрейма данных: TypeError: невозможно интерпретировать StringDtype как тип данных.Python

Программы на Python
Ответить
Anonymous
 Сравните столбцы фрейма данных: TypeError: невозможно интерпретировать StringDtype как тип данных.

Сообщение Anonymous »

Я пытаюсь сравнить два столбца и типа фреймов данных, чтобы проверить равенство, ожидается, что строки будут разными.
Я использую pandas версии 1.1.2
pd.__version__
'1.1.2'

if (df1.columns.difference(df2.columns).empty) and
(df1.dtypes == df2.dtypes).all()

Но в этой строке есть ошибки:
(df1.dtypes == df2.dtypes).all()

Traceback (most recent call last):
File "", line 1, in
File "/Users/vfrank/dev-working/venv/lib/python3.7/site-packages/pandas/core/ops/common.py", line 65, in new_method
return method(self, other)
File "/Users/vfrank/dev-working/venv/lib/python3.7/site-packages/pandas/core/ops/__init__.py", line 370, in wrapper
res_values = comparison_op(lvalues, rvalues, op)
File "/Users/vfrank/dev-working/venv/lib/python3.7/site-packages/pandas/core/ops/array_ops.py", line 239, in comparison_op
res_values = comp_method_OBJECT_ARRAY(op, lvalues, rvalues)
File "/Users/vfrank/dev-working/venv/lib/python3.7/site-packages/pandas/core/ops/array_ops.py", line 53, in comp_method_OBJECT_ARRAY
result = libops.vec_compare(x.ravel(), y.ravel(), op)
File "pandas/_libs/ops.pyx", line 169, in pandas._libs.ops.vec_compare
TypeError: Cannot interpret 'StringDtype' as a data type

Что происходит и как обойти эту проблему?
Обновление типов данных для первого кадра данных:
df1.dtypes
update_timestamp string
issue_type_desc string
id Int64
project_key string
teamname string
issue_key string
summary string
created_at string
updated_at string
updated_at_utc string
status_updated_at string
resolved_at string
closed_at string
due_date string
age_ts Int64
resolution_seconds string
reporter_name string
assignee string
issue_type_id Int64
priority_id Int64
status_id Int64
status_detail string
status_category string
resolution_id string
security_level_id Int64
parent_issue_key string
subtask_parent_key string
subtask_parent_id Int64
subtask_key string
epickey string
epic_id Int64
epic_parent_key string
customfield_fversion string
customfield_10004 string
epicdesc string
customfield_10005 string
sprint string
customfield_10003_original string
customfield_10003_status string
storypoint float64
storyhours float64
subtaskhours string
subcategory string
customfield_feature string
zephyr_last_executed_at string
zephyr_last_executed_by string
zephyr_last_execution_status string
fix_versions string
deleted Int64
lastupdateddatetime string
dtype: object

И для типов данных для второго кадра данных:
df2.dtypes
update_timestamp string
issue_type_desc string
id Int64
project_key string
teamname string
issue_key string
summary string
created_at string
updated_at string
updated_at_utc string
status_updated_at string
resolved_at string
closed_at string
due_date string
age_ts Int64
resolution_seconds string
reporter_name string
assignee string
issue_type_id Int64
priority_id Int64
status_id Int64
status_detail string
status_category string
resolution_id string
security_level_id Int64
parent_issue_key string
subtask_parent_key string
subtask_parent_id Int64
subtask_key string
epickey string
epic_id Int64
epic_parent_key string
customfield_fversion string
customfield_10004 string
epicdesc string
customfield_10005 string
sprint string
customfield_10003_original string
customfield_10003_status string
storypoint string
storyhours string
subtaskhours string
subcategory string
customfield_feature string
zephyr_last_executed_at string
zephyr_last_executed_by string
zephyr_last_execution_status string
fix_versions string
deleted Int64
lastupdateddatetime string
dtype: object

Обновление На данный момент мне удалось обойти эту ошибку, написав функцию для сравнения, но это не кажется идеальным решением. Я ожидаю, что будет способ сравнить dtype с этим новым типом расширения:
def compare_dataframe_column_dtypes(df_compare1, df_compare2):
"""Since pandas 1.0.0 and the inception of the StringDtype
doing `df1.dtypes == df2.dtypes` will fail on StringDtype,
so in order to compare dataframes one must catch this error
and convert to prior pd 1.0.0 string dtype and compare again.
"""
df1 = df_compare1.copy()
df2 = df_compare2.copy()
try:
if (df1.dtypes == df2.dtypes).all():
return True
return False
except Exception as ex:
logger.error("%s. Converting datatypes StringDType to str and then comparing again", ex.args[0])
for column in df1:
if pd.StringDtype.is_dtype(df1[column]):
df1[column] = df1[column].astype(str)
for column2 in df2:
if pd.StringDtype.is_dtype(df2[column2]):
df2[column2] = df2[column2].astype(str)
if (df1.dtypes == df2.dtypes).all():
return True
return False


Подробнее здесь: https://stackoverflow.com/questions/650 ... s-a-data-t
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»