Как построить график pandas по 2м столбцам, если они не имеют названия?
У меня есть csv-файл с данными вида как на скриншоте
Пытаюсь использовать функцию библиотеки df.plot.scatter(), но из-за того, что столбцы не имеют названий - не знаю как записать данные, пыталась через индексы, но вылезают ошибки... Нужно просто построить точечный график
Ответы (2 шт):
Вывод скаттер-плота из данных датафрейма с колонками, в которых нет названий делается элементарно:
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. рекомендую смотреть, где ЕЩЕ у нее ошибки в коде, а не минусовать правильные ответы. Ну или хотя-бы выполнять условия формулировки вопросов на сайте.
Удачи.
Ваши столбцы имеют названия, просто они не строковые, а числовые. Это именно 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 различаются, не сливаются.





