В датафрейм 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 никогда не использовать - это медленно и вообще неправильно.

→ Ссылка