通过df.groupby()将函数应用于pandas DataFrame - 导致困难

时间:2014-01-09 18:53:02

标签: python numpy pandas

我已经遇到过,我认为,这又是一个相当简单的问题。我想将以下函数应用于pandas数据框。

def cartesian_distance(A): # Cartesian distance function
    return [y - x for x, y in it.combinations(A, 2)]

可以看出,这是一个非常简单的函数,旨在消除传递的pandas行中所有值对之间的差异。如果它传递一行长度为6,那么它将返回6 *(6-1)* 0.5 = 15个值,依此类推。在我的情况下,我的数据行是12长,因此将返回66个结果值(距离)。

这就是我的所作所为:

import pandas as pd 
import itertools as it
import numpy as np

N = 12

def cartesian_distance(A):
    return [y - x for x, y in it.combinations(A, 2)]

# Use numpy.reshape to reshape the underlying data in the DataFrame
df_f_z = pd.DataFrame(df_f_z.values.reshape(-1,1),columns=list('Z'),index = arange(df_f_z.shape[0]*df_f_z.shape[1]))

上述行中发生的事情是数据框df_f_z被重新整形为(4203,12)到(50436,1)

time_id = np.repeat(np.arange(df_f_z.shape[0]//N), N) # temporary time-label group identifers 

以上用于创建时间标签组,以便该功能一次应用于一个组。

N_lim = int(0.5*N*(N-1))
result_index = ['Dz_{}'.format(tag) for tag in range(1,N_lim+1)]
cart_dist = df_f_z.groupby(time_id)[["Z"]].apply(lambda g: pd.Series(cartesian_distance(g), index=result_index))

可以预见这不起作用。我收到以下错误:

AssertionError: Index length did not match values

本质上,我试图采用与此问题中所示相同的方法:Bizarre issue with pandas' .groupby function, when function applied to rows,但只是使用不同的函数,应用于模糊相同的数据。事实证明它并不那么简单。

如果有人能提供一些指示,那将是最友善的。此外,重塑的pandas数组df_f_z可以在这里找到:https://www.dropbox.com/sh/80f8ue4ffa4067t/Pntl5-gUW4(如果有人有兴趣)。

1 个答案:

答案 0 :(得分:0)

这是我为使我的应用程序工作所做的。

import numpy as np
import pandas as pd
import itertools as it
import string

# Test data frame
N = 6
col_ids = string.letters[:N]
df = pd.DataFrame(
     np.random.randint(20, size=(5,N)),
     columns=['{}_z'.format(letter) for letter in col_ids])

N_lim = int(0.5*N*(N-1))
result_index = ['Dz_{}'.format(tag) for tag in range(1,N_lim+1)]

def cart_dist_2(A): # Cartesian distance function
    return [y - x for x, y in it.combinations(A, 2)]

test_2 = df.apply(lambda x: pd.Series(cart_dist_2(x),index=result_index),axis=1)

测试数据框看起来如此

  A_z  B_z  C_z  D_z  E_z  F_z
0   18   19    7    5   14    5
1   17    9    2   17    1    5
2   16   10   18   14   14    3
3    7    2   10    9    9   10
4   18    5   10   10    3   11

同样,我们正在寻找每行条目的所有可能组合之间的差异。生成的test_2数据框如下:

print test_2.values

[[  1 -11 -13  -4 -13 -12 -14  -5 -14  -2   7  -2   9   0  -9]
 [ -8 -15   0 -16 -12  -7   8  -8  -4  15  -1   3 -16 -12   4]
 [ -6   2  -2  -2 -13   8   4   4  -7  -4  -4 -15   0 -11 -11]
 [ -5   3   2   2   3   8   7   7   8  -1  -1   0   0   1   1]
 [-13  -8  -8 -15  -7   5   5  -2   6   0  -7   1  -7   1   8]]

希望这对其他人有用。

回顾一下:我忽略了对它进行分组并将该函数直接应用于数据框的行。