重复相同的过程来处理整个数据集

3

假设有一个数据框 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 和 1.1)这一组,并创建了一个数组。然后我用同样的方法处理了下一组(2 和 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个回答

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

此外,假设您想对每对列进行分组,也可以在 `axis=1` 上使用 `groupby`。
df.groupby(np.arange(len(df.columns))//2, axis=1).apply(lambda s: s.agg(list,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)}

Sample

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接