对整个数据集重复相同的过程

时间:2019-08-19 13:55:57

标签: python pandas

给出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)

所以我想获取一个包含所有列组合的新数据集(也许)

2 个答案:

答案 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
.
.
.

假设您需要每两列,也可以groupbyaxis=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)]}