我有一个类似的数据框:
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]]
请随时询问是否不清楚。
到目前为止,我尝试成对分组,并尝试了移位操作。 但我没有设法制作成对记录。
答案 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)]))