Составление пары по 2 ряда и нарезка из каждого ряда - PullRequest
0 голосов
/ 04 июня 2018

У меня есть такой фрейм данных:

    x1    y1    x2    y2
0  149  2653  2152  2656
1  149  2465  2152  2468
2  149  1403  2152  1406
3  149  1215  2152  1218
4  170  2692  2170  2695
5  170  2475  2170  2478
6  170  1413  2170  1416
7  170  1285  2170  1288

Мне нужно соединить каждые две строки из индекса фрейма данных.то есть, [0,1], [2,3], [4,5], [6,7] и т. д.,

и извлекают x1, y1 из первой строки пары x2,y2 из второй строки пары , аналогично для каждой пары строк.

Пример вывода:

[[149,2653,2152,2468],[149,1403,2152,1218],[170,2692,2170,2478],[170,1413,2170,1288]]

Пожалуйста, не стесняйтесь спрашивать, если это не ясно.

До сих пор я пробовал группировать по парам и пробовал операцию сдвига.Но мне не удалось сделать пару записей.

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Вот одно решение через numpy.hstack.Обратите внимание, что естественно подавать numpy массивы непосредственно в pd.DataFrame, поскольку Pandas хранит данные внутри себя.

import numpy as np

arr = np.hstack((df[['x1', 'y1']].values[::2],
                 df[['x2', 'y2']].values[1::2]))

res = pd.DataFrame(arr)

print(res)

     0     1     2     3
0  149  2653  2152  2468
1  149  1403  2152  1218
2  170  2692  2170  2478
3  170  1413  2170  1288
0 голосов
/ 04 июня 2018

Вот решение с использованием пользовательского итератора, основанного на iterrows(), но оно немного неуклюже:

import pandas as pd
df = pd.DataFrame( columns=['x1','y1','x2','y2'], data=
    [[149, 2653, 2152, 2656], [149, 2465, 2152, 2468], [149, 1403, 2152, 1406], [149, 1215, 2152, 1218],
    [170, 2692, 2170, 2695], [170, 2475, 2170, 2478], [170, 1413, 2170, 1416], [170, 1285, 2170, 1288]] )

def iter_oddeven_pairs(df):

    row_it = df.iterrows()

    try:
        while True:
            _,row = next(row_it)
            yield row[0:2]
            _,row = next(row_it)
            yield row[2:4]
    except StopIteration:
        pass

print(pd.concat([pair for pair in iter_oddeven_pairs(df)]))
0 голосов
/ 04 июня 2018

Решение Python:

Выберите значения столбцов по позициям до list s:

a = df[['x2', 'y2']].iloc[1::2].values.tolist()
b = df[['x1', 'y1']].iloc[0::2].values.tolist()

А затем zip и объедините их в понимании списка:

L = [y + x for x, y in zip(a, b)]
print (L)
[[149, 2653, 2152, 2468], [149, 1403, 2152, 1218], 
 [170, 2692, 2170, 2478], [170, 1413, 2170, 1288]]

Спасибо, @ user2285236, за другое решение:

L = np.concatenate([df.loc[::2, ['x1', 'y1']], df.loc[1::2, ['x2', 'y2']]], axis=1).tolist()

Чистое решение для панд:

Первое DataFrameGroupBy.shift по каждой 2 строке:

df[['x2', 'y2']] = df.groupby(np.arange(len(df)) // 2)[['x2', 'y2']].shift(-1)
print (df)
    x1    y1      x2      y2
0  149  2653  2152.0  2468.0
1  149  2465     NaN     NaN
2  149  1403  2152.0  1218.0
3  149  1215     NaN     NaN
4  170  2692  2170.0  2478.0
5  170  2475     NaN     NaN
6  170  1413  2170.0  1288.0
7  170  1285     NaN     NaN

Затем удалите строки NaN s, преобразуйте в int, а затем в list:

print (df.dropna().astype(int).values.tolist())
[[149, 2653, 2152, 2468], [149, 1403, 2152, 1218], 
 [170, 2692, 2170, 2478], [170, 1413, 2170, 1288]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...