使用2行并从每行切片

时间:2018-06-04 08:13:26

标签: python pandas dataframe coordinates

我有一个类似的数据框:

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

对于每对行,

从对的第二行x2中提取x1,y1,从对象的第二行提取y2

示例输出:

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

请随时询问是否不清楚。

到目前为止,我尝试成对分组,并尝试了移位操作。 但我没有设法制作成对记录。

3 个答案:

答案 0 :(得分:2)

Python解决方案:

按位置选择列的值 Assembly MyDALL = Assembly.LoadFile("Test.dll"); Type MyLoadClass = MyDALL.GetType("Test.Class1"); object obj = Activator.CreateInstance(MyLoadClass);

list

然后a = df[['x2', 'y2']].iloc[1::2].values.tolist() b = df[['x1', 'y1']].iloc[0::2].values.tolist() 并在列表理解中加入:

zip

谢谢@ user2285236的另一个解决方案:

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

纯大熊猫解决方案:

每两行首先DataFrameGroupBy.shift

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

然后删除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,然后转换为int

list

答案 1 :(得分:2)

以下是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

答案 2 :(得分:0)

这是一个使用基于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)]))