LINUX.ORG.RU

Pandas наркоманы писали?

 , , ,


0

1

Собственно, вопрос кроется в следующем коде:

#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import pandas as pd

files = ['my_file.csv']
for file in files:
    df = pd.read_csv(file, delimiter=";")
    df1 = df[df['Наличие кота']]  # True/False (True)
    df2 = df[~df['Наличие кота']]  # True/False (False)
    df3 = df[df['Цвет машины'] == 'yellow']  # string
    df4 = df[df['Цвет машины'] == 'red']  # string
    df5 = df[df['Зарплата'] >= 100500 ]  # int/float
    df6 = df[df['Зарплата'] < 100500 ]  # int/float
Почему так? Зачем такая неоднородность? Я час тупил и не мог понять что тут не так и отчего код не работал в случае True/False значений в колонке.

PS

Разумеется в моих данных совершенно другие столбцы, про котов, цвет машины и ЗП это я по приколу вписал, но суть не меняется.

★★★★★

У меня всё работает:

Наличие кота;Цвет машины;Зарплата
True;yellow;100600
True;red;100
False;red;100
False;yellow;100600
>>> df2 = df[~df['Наличие кота']]
>>> df2
   Наличие кота Цвет машины  Зарплата
2         False         red       100
3         False      yellow    100600
byko3y ★★★★
()
Ответ на: комментарий от byko3y

А мог бы просто УМВР написать и ничего не пояснять :)

anonymous
()
Ответ на: комментарий от byko3y

Понятно что работает, я рабочий код написал (хотя со строками не тестировал, а брал со стаковерфлоу). Прикол в том, что синтаксис разнообразный в случае bool значений. Т.е. отличается от строк и цифр. Тильду видел? С == пробуй, узнаешь много интересного.

peregrine ★★★★★
() автор топика
Последнее исправление: peregrine (всего исправлений: 2)
Ответ на: комментарий от peregrine
>>> df1 = df[df['Наличие кота']==True]
>>> df1
   Наличие кота Цвет машины  Зарплата
0          True      yellow    100600
1          True         red       100

УМВР, ЧЯДНТ?

byko3y ★★★★
()
Ответ на: комментарий от byko3y

УМВР, ЧЯДНТ?

Не ставишь кавычки, ну и вообще ==True это моветон для питона у него is есть... Ну вообще ответ в шибко умном pandas, который воспринимает Bool столбец как Bool, а не как строки...

peregrine ★★★★★
() автор топика
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от peregrine
>>> df = pd.read_csv('my_file.csv', delimiter=';', dtype=str)
>>> df[df['Наличие кота'] == 'true']
  Наличие кота Цвет машины Зарплата
0         true      yellow   100600
>>> df['Наличие кота'] = df['Наличие кота'].str.lower()
>>> df[df['Наличие кота'] == 'true']
  Наличие кота Цвет машины Зарплата
0         true      yellow   100600
1         true         red      100
byko3y ★★★★
()
Ответ на: комментарий от peregrine

'true'

Исправь на 'True' везде и наслаждайся

Наличие кота;Цвет машины;Зарплата
True;yellow;100600
True;red;100
False;red;100
False;yellow;100600
>>> df = pd.read_csv('my_file.csv', delimiter=';', dtype=str)
>>> df[df['Наличие кота'] == 'True']
  Наличие кота Цвет машины Зарплата
0         True      yellow   100600
1         True         red      100

Я по прежнему не понимаю, о чем тред. Если ты хотел указать на неудобную автоматизацию, то это мимо кассы — pandas вполне управляемо читает CSV. Если где и есть анальный секас, то это в Excel, в котором ты грузишь «20.02», а в итоге читаешь «138271», и никак ты это автопревращение не отключишь. По сравнению с экселем пандас — это невинный минетик.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Хм, значит оно от версии тоже зависит. У меня от future ругань идёт про то что сравнение невозможно с недр пандаса и оно вместо него вектора сравнивать будет, ну а в результате пустой датафрейм получается. Вот то что у тебя в самом последнем посте на который я ответил. Можешь полный код кинуть, я гляну, может совсем глаз замылился и не вижу очевидного?

peregrine ★★★★★
() автор топика
Ответ на: комментарий от peregrine

Вот то что у тебя в самом последнем посте на который я ответил. Можешь полный код кинуть, я гляну, может совсем глаз замылился и не вижу очевидного?

Это были разные коды под разные данные. Последний код более ничего из себя не представлял, поскольку я тестировал только одну булеву выборку. А до него было CSV с разными регистрами в булевых полях, для чего применялось преобразование регистра.

byko3y ★★★★
()
Ответ на: комментарий от peregrine

узнаешь много интересного

Например что csv нетипизированный, невозможно понять строка у тебя в колонке или bool, строку к bool можно преобразовывать по разным правилам, и в pandas сделали какое-то своё, отличное от дефолтного, ломающего дейтасайнс-обезьязам мозги

>>> bool('False')
True

?

slovazap ★★★★★
()
Ответ на: комментарий от steemandlinux

Единственное можно было бы сделать not, а не ~

По-моему, нельзя, потому что not строго вызывает __bool__ и возвращает True/False, а тут нужно возвращать разные объекты Pandas. И, я думаю, хорошо, что нельзя.

В целом тоже не могу понять, почему автор удивляется. Если не нравится преобразование типов данных по умолчанию, у read_csv есть аргумент dtype для явного выбора типа данных и даже аргумент converters для задания собственных конвертеров.

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 2)

Это ты ещё до типов datetime64, datetime64[ns] и ещё deprecated с TimeZone не добирался. Там самая мякотка.

Shadow ★★★★★
()
Ответ на: комментарий от proud_anon

По-моему, нельзя, потому что not строго вызывает __bool__ и возвращает True/False, а тут нужно возвращать разные объекты Pandas. И, я думаю, хорошо, что нельзя

Да, это хорошо, что питон слеплен из противоречивых сущностей, и, к тому же, имеет отвратительные лямбды, которые здесь по уму должны были быть использованы вместо бессмысленного и беспощадного синтаксиса запроса по ключу.

byko3y ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.