我已经遇到过,我认为,这又是一个相当简单的问题。我想将以下函数应用于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(如果有人有兴趣)。
答案 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]]
希望这对其他人有用。
回顾一下:我忽略了对它进行分组并将该函数直接应用于数据框的行。