#python #pandas #numpy #jupyter-notebook #ipython
Вопрос:
мне нужен совет. В моей базе данных у меня есть точки x и точки y в форме:
df = pd.read_sql_table('table', cnx)
ID | кривые |
---|---|
1 | [(x,y),(x,y),(x,y) и т.д.] |
2 | [(x,y),(x,y),(x,y) и т.д.] |
type(df['curves']) #pandas.core.series.Series
И я хотел бы попробовать построить линейный график.
Я пробую несколько решений. но у меня ничего не получалось.
data = df['curves']
plt.plot(*zip(*data))
plt.show()
или
data_in_array = np.array(data)
transposed = data_in_array.T
x,y = transposed #but here i got error - not enough values to unpack (expected 2, got 1)
Пожалуйста, посоветуйтесь
Ответ №1:
Разнесите столбец списка кривых
df = df.explode('curves').reset_index()
Создайте отдельные столбцы x и y
df['curves_x'] = df.curves.str[0]
df['curves_y'] = df.curves.str[1]
Сюжет с использованием сиборна
import seaborn as sns
import matplotlib.pyplot as plt
sns.lineplot(data=df, x='curves_x', y='curves_y', hue='id')
plt.show()
Чтобы лучше понять, давайте возьмем некоторые примеры данных,
id curves
0 1 [(10, 20), (20, 30), (30, 50)]
1 2 [(10, 10), (20, 40), (30, 20)]
Разнесите столбец и сбросьте индекс
id curves
0 1 (10, 20)
1 1 (20, 30)
2 1 (30, 50)
3 2 (10, 10)
4 2 (20, 40)
5 2 (30, 20)
Создайте столбцы x и y
id curves curves_x curves_y
0 1 (10, 20) 10 20
0 1 (20, 30) 20 30
0 1 (30, 50) 30 50
1 2 (10, 10) 10 10
1 2 (20, 40) 20 40
1 2 (30, 20) 30 20
Сюжет будет выглядеть так
Комментарии:
1. Спасибо, что уделили мне время, но у меня это не работает. Когда я просматриваю его, у меня в столбце
curves_x
:[
и вcurves_y
:(
2. Перед всем этим убедитесь, что ваш
curves
столбец имеет тип списка, а не строку. Если это строка (что, по-видимому, так и есть), используйтеtestdf['curves'] = testdf['curves'].map(ast.literal_eval)
иimport ast
тоже @Cesc3. когда я это делаю, я получаю сообщение об ошибке:
A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy self._set_item(key, value)
4. Используйте
df.loc[:, 'curves'] = df['curves'].map(ast.literal_eval)
@Cesc5. по-прежнему ничего —
ValueError: malformed node or string: [(0, 4.579), (0.2153549, 9.862635), (0.4196396, 9.862635), (0.6154251, 9.069808), (0.8132706, 22.54274), (1.012405, 20.9576), (1.210602, 21.57384), (1.409637, 23.24702), (1.61058, 21.92599), (1.80954, 25.53644), (2.008942, 24.9202), (2.20961, 22.63078), (2.410034, 25.36037), (2.609161, 22.63078), (2.80925, 23.33506), (2.929764, 24.48002), (3.129486, 29.58708), (3.328705, 32.22915), (3.529053, 37.3362), (3.729904, 33.28557), (3.928864, 30.82008), (4.128937, 28.79476), (4.330307, 26.50534)......]