В датафрейм Pandas внести значения строк, выровненных по одному из столбцов
У меня таблица, где 2 расчета косинусов: второй идет по точкам с интервалом, в 2 раза более частым, чем первый.
Таким образом, в некоторых точках все значения совпадают, в других нет.
Требуется: разнести строки. Там, где значения совпадают - все значения ставим в одну строку, где не совпадают - значения ставим на новую строку.
На выходе должно быть так:
i x_i cos(x_i) x_j cos(x_j)
0 0.000 0.000 0.000 0.000
1 0.157 0.987
2 0.314 0.309 0.314 0.309
3 0.471 0.891
Код:
import pandas as pd
dataframe = pd.DataFrame()
dataframe['i'] = pd.Series([0.00, 0.314, 0.628, 0.942])
dataframe['cos(x_i)'] = pd.Series([0.000, 0.309, 0.587, 0.809])
dataframe['j'] = pd.Series([0.00, 0.157, 0.314, 0.471])
dataframe['cos(x_j)'] = pd.Series([0.000, 0.987, 0.309, 0.891])
for col in dataframe:
if dataframe.iloc['i'] == dataframe.iloc['j']:
# в датафрейм вносим всю строку
else:
# спускаемся на строку ниже
# в датафрейм вносим ячейки столбцов 'j' и 'cos(x_j)'
Ответы (1 шт):
Автор решения: CrazyElf
→ Ссылка
Ну вот вам через merge, фактически это LEFT OUTER JOIN, говоря языком SQL. Пришлось потом колонки местами переставить только, ну и отфильтровать NA в j:
df = pd.merge(dataframe[['j', 'cos(x_j)']], dataframe[['i', 'cos(x_i)']],
how='outer', left_on='j', right_on='i')
df = df[['i', 'cos(x_i)', 'j', 'cos(x_j)']]
df = df[~df['j'].isna()]
df
| index | i | cos(x_i) | j | cos(x_j) |
|---|---|---|---|---|
| 0 | 0.0 | 0.0 | 0.0 | 0.0 |
| 1 | NaN | NaN | 0.157 | 0.987 |
| 2 | 0.314 | 0.309 | 0.314 | 0.309 |
| 3 | NaN | NaN | 0.471 | 0.891 |
А циклы лучше с Pandas никогда не использовать - это медленно и вообще неправильно.