给出DataFrame df:
1 1.1 2 2.1 ... 1600 1600.1
0 45.1024 7.2365 45.8769 7.1937 34.1072 8.4643
1 43.1024 8.9645 32.5798 7.7500 33.1072 9.3564
2 42.1024 6.7498 25.1027 7.3496 26.1072 6.3665
我执行了以下操作:我选择了第一对(1 and 1.1)
对,并创建了一个数组。然后,我对以下几对(2 and 2.1)
做了同样的事情。
x = df['1']
y = df['1.1']
P = np.array([x, y])
和
q = df['2']
w = df['2.1']
Q = np.array([q, w])
最终手术为:
Q_final = list(zip(Q[0], Q[1]))
P_final = list(zip(P[0], P[1]))
现在我要对整个数据集执行此操作。但这需要很多时间。您知道如何在短时间内进行迭代吗?
编辑
毕竟我在做
df = similaritymeasures.frechet_dist(P_final, Q_final)
所以我想获取一个包含所有列组合的新数据集(也许)
答案 0 :(得分:5)
一种简单的方法是在轴1上使用agg
def f(s):
s = iter(s)
return list(zip(s,s))
agg = df.agg(f,1)
然后使用.str
进行检索。例如,
agg.str[0] # P_final
agg.str[1] # Q_final
.
.
.
假设您需要每两列,也可以groupby
跨axis=1
df.groupby(np.arange(len(df.columns))//2, axis=1).apply(lambda s: s.agg(list,1))
答案 1 :(得分:2)
您可能不想创建1600个单独的变量。将此存储在dict
之类的容器中,其中的键引用原始列的句柄:
{idx: list(zip(gp.iloc[:, 0], gp.iloc[:, 1]))
for idx, gp in df.groupby(df.columns.str.split('.').str[0], axis=1)}
# or
{idx: [*map(tuple, gp.to_numpy())]
for idx, gp in df.groupby(df.columns.str.split('.').str[0], axis=1)}
import pandas as pd
import numpy as np
np.random.seed(42)
df = pd.DataFrame((np.random.randint(1,10,(5,6))))
df.columns = ['1', '1.1', '2', '2.1', '3', '3.1']
# 1 1.1 2 2.1 3 3.1
#0 7 4 8 5 7 3
#1 7 8 5 4 8 8
#2 3 6 5 2 8 6
#3 2 5 1 6 9 1
#4 3 7 4 9 3 5
{idx: list(zip(gp.iloc[:, 0], gp.iloc[:, 1]))
for idx, gp in df.groupby(df.columns.str.split('.').str[0], axis=1)}
#{'1': [(7, 4), (7, 8), (3, 6), (2, 5), (3, 7)],
# '2': [(8, 5), (5, 4), (5, 2), (1, 6), (4, 9)],
# '3': [(7, 3), (8, 8), (8, 6), (9, 1), (3, 5)]}