Как построить график pandas по 2м столбцам, если они не имеют названия?

У меня есть csv-файл с данными вида как на скриншоте скрин Пытаюсь использовать функцию библиотеки df.plot.scatter(), но из-за того, что столбцы не имеют названий - не знаю как записать данные, пыталась через индексы, но вылезают ошибки... Нужно просто построить точечный график


Ответы (2 шт):

Автор решения: passant

Вывод скаттер-плота из данных датафрейма с колонками, в которых нет названий делается элементарно:

import pandas as pd
import matplotlib.pyplot as plt
df=pd.DataFrame([[2,1],[3,6],[4,2]])
print (df)
plt.scatter(df[0],df[1])

Если очень хочется именно через df.plot.scatter() то так

cols = df.columns.tolist()
df.plot.scatter(cols[0],cols[1])

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

Удачи.

P.S. Дополнение к ответу по мотивом комментария ТС. Поскольку автор вопроса вместо того, что-бы сесть, почитать документацию и спокойно разобраться, решила поминусовать меня - ну типа "график все равно выглядит неправильно", решил дополнить свой ответ, показав ПОШАГОВО, как и что надо делать.

Поскольку ТС не удосужилась даже прочитать правила этого сайта, которые требуют предоставлять воспроизводимый пример (другими словами ей лень было привести свой набор данных так, что-бы с ним можно было работать) привожу искусственный набор данных, который мне не лень было набрать: Итак:

Шаг 1. Создаем тренировочный набор данных:

import pandas as pd
df=pd.DataFrame([[0,1,1],[0,2,4],[0,3,3],[0,4,5],[0,5,7]])
print(df)

Имеем:

   0  1  2
0  0  1  1
1  0  2  4
2  0  3  3
3  0  4  5
4  0  5  7

Шаг 2. Удаляем из него нулевой столбец:

df.drop(df.columns[[0]], axis = 1, inplace=True)
print(df)

Привели датафрейм к виду, как у ТС в вопросе:

   1  2
0  1  1
1  2  4
2  3  3
3  4  5
4  5  7

Шаг 3. Рисуем график, как было предложено в ответе выше:

cols = df.columns.tolist()
df.plot.scatter(cols[0],cols[1])

получаем:

введите сюда описание изображения

Как видите, все рисуется правильно.

Если у ТС "точки расположены просто по вертикальной прямой" то переходим к

Шаг 4. рекомендую смотреть, где ЕЩЕ у нее ошибки в коде, а не минусовать правильные ответы. Ну или хотя-бы выполнять условия формулировки вопросов на сайте.

Удачи.

→ Ссылка
Автор решения: CrazyElf

Ваши столбцы имеют названия, просто они не строковые, а числовые. Это именно 1, 2, 3 в виде целых чисел, а не в виде строк '1', '2', '3'.

Код для моделирования ваших данных:

import pandas as pd
import numpy as np

df = pd.DataFrame((np.random.rand(100, 4)-0.5)/100)
df.iloc[:,1] = np.random.choice(2, size=100)
df = df.drop(columns=0)
df

Содержимое нескольких первых строк df:

1 2 3
0 0 0.001186 -0.002849
1 1 -0.001516 -0.003497
2 0 0.001159 0.002624

Попробуем нарисовать графики. Помним, что названия колонок - это числа 1, 2, 3.

df.plot.scatter(x=1, y=2);

введите сюда описание изображения

Да, мы увидим две вертикальные линии из точек. Ну так это потому, что колонка 1 состоит только из значений 0 и 1, вот по этим линиям на оси x и выстроились все точки графика.

df.plot.scatter(x=2, y=3);

введите сюда описание изображения

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

UPDATE

Хорошо, смотрим на ваших данных, которые вы предоставили. Отрисовка в точности тем же кодом, которым я рисовал на своих сгенерированных данных:

import pandas as pd
import matplotlib.pylab as plt

df = pd.read_csv('out_vectors.csv', sep=';', decimal=',', header=None, index_col=0)
df.plot.scatter(x=2, y=3);

введите сюда описание изображения

Смотрим график. Ну тут видно, что у вас есть сильные выбросы, особенно выделяется один выброс в колонке 2 аж за -0.7, из-за этих выбросов диаграмма рассеяния слилась практически в одну линию. Хотите рассмотреть детали графика получше? Можно ограничить его для этого по оси x:

df.plot.scatter(x=2, y=3);
plt.xlim(-0.025, 0.025);

введите сюда описание изображения

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

UPDATE2

Раскраска делается с помощью параметра c=, но с вашими цветами всё сливается в дефолтной палитре, поэтому нужно ещё подбирать палитру и указывать её через cmap=.

df.plot.scatter(x=2, y=3, c=1, cmap='tab20');
plt.xlim(-0.025, 0.025);

введите сюда описание изображения

У вас там далеко не только 0 и 1, а там значения вплоть до 11, поэтому цветов много. Но в основном 0 и 1, поэтому палитру нужно брать такую, где 0 и 1 различаются, не сливаются.

→ Ссылка