Создайте Dataframe из серии и, в частности, как переименовать столбец в нем (пример: с помощью NA/NaN)

Новое в Python. Я родом из мира SQL, где я привык выполнять запросы и применять их. Удобно взять список вещей, получить их количество, а затем использовать подмножество этого количества (например, 5 лучших) и применить его к другим данным. С Python/Pandas я до сих пор не совсем понял процесс. В качестве примера:

Простой набор данных:

`import pandas as pd

dataset = (
    [1,2,3,4,5,6],
    [1,None,3,4,5,6],
    [1,None,3,4,5,6],
    [1,2,None,4,5,6],
    [1,None,3,None,5,6],
    [1,2,None,4,5,6],
    [1,None,3,None,5,6],
    [1,2,3,4,5,None],
    [1,2,3,4,5,None]
)    
df = pd.DataFrame(dataset, columns=['A','B','C','D','E','F'])`

Затем создайте фрейм данных, чтобы найти NaN: nan_df = df.isna()

Затем посчитайте экземпляры каждой строки: grouped_nan = nan_df.groupby(['A','B', 'C', 'D','E', 'F'], sort=True).value_counts()

Исходный набор, над которым я работал, содержал около 200 строк. Этот упрощенный пример дает следующее:

A      B      C      D      E      F    
False  False  False  False  False  False    1
                                   True     2
              True   False  False  False    2
       True   False  False  False  False    2
                     True   False  False    2
Name: count, dtype: int64

Здесь у меня возникают проблемы. То, что я хочу сделать, лучше всего делать в Dataframe (выше — серия). Следующее делает его DataFrame:

grouped_nan_df = grouped_nan.to_frame()

Но последний столбец (счетчик) не включается так, как я могу. Я это вижу, но ничего не могу с этим поделать.

Если я попытаюсь сослаться на столбец со счетчиками, он его не распознает.

Если я попытаюсь переименовать этот последний столбец, это не сработает:

`grouped_nan_df.rename(columns = {grouped_nan_df.columns[5]:"new_count"}, inplace=True)`

выдает ошибку «индекс 5 выходит за пределы оси 0 с размером 1».

В конце мне нужен DataFrame, включающий счетчики. Есть ли способ туда добраться?

Любая помощь приветствуется!

Энди

Просто reset_index() после value_counts.

mozway 05.04.2024 07:09

@mozway Спасибо! По какой-то причине, когда я делаю это, а затем пытаюсь вызвать столбец, хотя он type() как фрейм данных, я получаю сообщение об ошибке, в котором говорится, что объект DataFrame не может быть вызван. Ответ ниже аналогичен тому, что вы предложили. но использует размер, который я затем могу назвать. Я не знаю, в чем разница, кроме этого.

AndyB 06.04.2024 07:34

вам скорее всего не нужен groupby. Я считаю, что ваша ошибка связана с чем-то неправильным, что вы сделали в коде, который здесь не показан. Этого не должно случиться. Попробуйте запустить новую оболочку/ноутбук со своим минимальным примером. Смотрите мой ответ ниже. Примечание. value_counts следует отдавать предпочтение groupby.size, поскольку он более эффективен.

mozway 06.04.2024 07:53
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
3
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

IIUC, вы можете просто использовать groupby с as_index=False, а затем взять размер группы :

out = nan_df.groupby(['A','B', 'C', 'D','E', 'F'], as_index=False).size()

Выход:

       A      B      C      D      E      F  size
0  False  False  False  False  False  False     1
1  False  False  False  False  False   True     2
2  False  False   True  False  False  False     2
3  False   True  False  False  False  False     2
4  False   True  False   True  False  False     2

Спасибо! Я точно не знаю, почему это становится фреймом данных, а не серией, как раньше, но он работает и возвращается как фрейм данных. Я пытался проголосовать за ответ, но мне это не позволило (у меня недостаточно репутации) — извините.

AndyB 06.04.2024 07:36

@AndyB as_index=False добавляет в результат столбцы группировки, поэтому вы получаете фрейм данных, а не серию, индексированную этими столбцами.

Nick 06.04.2024 08:31

Достаточно просто добавить reset_index:

Кроме того, поскольку вы используете все столбцы, вам не нужно groupby:

import pandas as pd

dataset = (
    [1,2,3,4,5,6],
    [1,None,3,4,5,6],
    [1,None,3,4,5,6],
    [1,2,None,4,5,6],
    [1,None,3,None,5,6],
    [1,2,None,4,5,6],
    [1,None,3,None,5,6],
    [1,2,3,4,5,None],
    [1,2,3,4,5,None]
)    
df = pd.DataFrame(dataset, columns=['A','B','C','D','E','F'])

nan_df = df.isna()

grouped_nan = (nan_df[['A','B', 'C', 'D','E', 'F']]
               .value_counts()
               .reset_index()
               )

print(grouped_nan)

Или просто:

nan_df = df.isna()

grouped_nan = nan_df.value_counts().reset_index()

print(grouped_nan)
       A      B      C      D      E      F  count
0  False  False  False  False  False  False      1
1  False  False  False  False  False   True      2
2  False  False   True  False  False  False      2
3  False   True  False  False  False  False      2
4  False   True  False   True  False  False      2

Я запустил timeit для обоих решений, и время на моей машине практически одинаковое.

Nick 06.04.2024 08:46

@Ник, интересно, я почти уверен, что раньше было быстрее. Я только что проверил исходный код и обнаружил, что value_countsвнутренне использует groupby.size. Я не знаю, то ли у меня подвела память, то ли код был улучшен;)

mozway 06.04.2024 09:05

Одно можно сказать наверняка: groupby+value_counts не нужен!

mozway 06.04.2024 09:06

Интересный. Таким образом, они по сути запускают один и тот же код, а значит, и в одно и то же время. Однако, как вы говорите, groupby в этом случае совершенно излишен.

Nick 06.04.2024 09:10

@Ник Series.value_countsбыстрее , что groupby.size (он использует другой алгоритм), это действительно не относится к DataFrames.

mozway 06.04.2024 09:43

Опять интересно. Итак, теперь вопрос в том, почему фреймы данных не используют более быстрый алгоритм...

Nick 07.04.2024 00:42

Спасибо вам обоим. Здесь кое-что узнал! Я думаю, что SQL заставил меня подумать, что группировка необходима.

AndyB 08.04.2024 07:12

Другие вопросы по теме