Как проверить dtypes всех столбцов в df одинаковы или нет в python?

#python #pandas #dataframe #user-defined-types

#python #панды #фрейм данных #определяемые пользователем типы

Вопрос:

Я новичок в Pandas, я хотел проверить, все ли столбцы df одинаковы или нет. Тем не менее, я пытался это сделать, но, хотя я получаю сообщение об ошибке

 print(df.columns)
Index(['age', 'car', 'car_name'], dtype='object') 
 

где age, car — это int, float, а car_name — объект

 for i in df:
    if df[i].dtypes == int or df[i].dtypes == float:
        print('yes')
    else:
        print('no')
this gives:
yes
yes
no
 

но то, что я хочу, это дать в целом, например, если во всех столбцах есть int или float, он должен печатать yes, иначе no . (с помощью if else условия)

исключенный вывод:

 for i in df:
        if all column of df == int or all column of df == float:
            print('yes')
        else:
            print('no')
output: 'No'
 

Комментарии:

1. Как выглядит ожидаемый результат?

2. df.dtypes.drop_duplicates().shape[0]== 1

Ответ №1:

Или, возможно, проверьте, больше ли где 1 dtypes :

 df.dtypes.nunique()>1
 

Вернется True , если ваш df имеет разные dtypes.

Комментарии:

1. как получить dtype этого уникального типа?

Ответ №2:

 def is_same(df):
    # this method returns true if all types are same, else returns false
    no_of_types = len(df.dtypes.unique())
    is_same = no_of_types == 1
    return is_same

diff_types1 = pd.DataFrame({"a": [1,2,3], "b": [2,3,4], "c": ["A", "C", "E"]})
diff_types2 = pd.DataFrame({"a": [1,2,3], "b": [2.0,3.1,4.2], "c": [2, 4, 5]})
same_types = pd.DataFrame({"a": [1,2,3], "b": [2,3,4], "c": [2, 4, 5]})
same_types2 = pd.DataFrame({"a": ["A", "C", "E"], "b": ["A", "C", "E"], "c": ["A", "C", "E"]})

is_same(diff_types1)
# False

is_same(diff_types2)
# False

is_same(same_types1)
# True

is_same(same_types2)
# True
 

Комментарии:

1. Я действительно хотел в условии if и else, возможно ли это? например, если столбцы df имеют значение int/float, то выведите ‘yes’

2. я добавил еще один ответ, который дает true или false, если все типы являются числовыми или нет

Ответ №3:

Вы можете использовать

 df.dtypes.drop_duplicates().shape[0]== 1
 

Вот один из примеров:

 >>> import pandas as pd
>>> df = pd.DataFrame()
>>> df['a'] = 1, 2, 3
>>> df['b'] = 4, 5, 6
>>> df.dtypes.drop_duplicates().shape[0]== 1
True
>>> df['b'] = 0.1, 0.2, 0.3
>>> df.dtypes.drop_duplicates().shape[0]== 1
False
 

Ответ №4:

 from pandas.api.types import is_numeric_dtype
def is_int_or_float(df):
    # this method returns true if all types are numeric
    is_numeric_types = sum([is_numeric_dtype(x) for x in df])
    return is_numeric_types

diff_types1 = pd.DataFrame({"a": [1,2,3], "b": [2,3,4], "c": ["A", "C", "E"]})
diff_types2 = pd.DataFrame({"a": [1,2,3], "b": [2.0,3.1,4.2], "c": [2, 4, 5]})
same_types = pd.DataFrame({"a": [1,2.2,3], "b": [2,3,4], "c": [2, 4, 5]})
same_types2 = pd.DataFrame({"a": ["A", "C", "E"], "b": ["A", "C", "E"], "c": ["A", "C", "E"]})

print(is_same(diff_types1))
# False

print(is_same(diff_types2))
# False

print(is_same(same_types1))
# True

print(is_same(same_types2))
# True
 

Ответ №5:

Существует много подходов к решению этой проблемы. Вот одно из решений:

 all(x == df.dtypes[0] for x in df.dtypes)
 

Возвращает true, если все столбцы имеют одинаковый тип данных.

Этот одиночный вкладыш сначала создает список логических значений, сравнивая все записи с df.dtypes типом данных первого элемента. all() Функция возвращает true, если все записи True