Mam ramkę danych taką jak:

    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

Muszę sparować przez każde dwa wiersze z indeksu ramy danych. tj. [0,1], [2,3], [4,5], [6,7] itd.,

I Ekstrakt X1, Y1 od pierwszego rzędu pary x2, Y2 z drugiego rzędu pary , podobnie dla każdej pary wierszy.

Przykładowe dane wyjściowe:

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

Zapytaj, czy nie jest jasne, czy nie jest jasne.

Do tej pory próbowałem grupować pary, i próbowałem operacji zmiany. Ale nie udało mi się wykonać zapisywania pary.

2
Mohamed Thasin ah 4 czerwiec 2018, 11:13

3 odpowiedzi

Najlepsza odpowiedź

Python Solution:

Wybierz wartości kolumn według pozycji do list s:

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

A następnie zip i dołącz do siebie w rozumieniu listy:

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]]

Dziękujemy, @ user2285236 dla innego rozwiązania:

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

Rozwiązanie PURE PANDAS:

Najpierw DataFrameGroupBy.shift przez każde 2 rzędy:

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

Następnie usuń NaN s rzędów, przekonwertować na int, a następnie do list:

print (df.dropna().astype(int).values.tolist())
[[149, 2653, 2152, 2468], [149, 1403, 2152, 1218], 
 [170, 2692, 2170, 2478], [170, 1413, 2170, 1288]]
3
jezrael 4 czerwiec 2018, 08:28

Oto rozwiązanie przy użyciu niestandardowego iteratora na podstawie iterrows(), ale jest nieco zaklęczny:

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
smci 4 czerwiec 2018, 08:48

Oto jedno rozwiązanie przez numpy.hstack. UWAGA Jest naturalny, aby zasilać numpy macierzy bezpośrednio do pd.DataFrame, ponieważ w ten sposób pandy przechowuje dane wewnętrznie.

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
2
jpp 4 czerwiec 2018, 08:32