Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否有使用自定义函数“交叉应用”数据帧的功能?_Python_Pandas - Fatal编程技术网

Python 是否有使用自定义函数“交叉应用”数据帧的功能?

Python 是否有使用自定义函数“交叉应用”数据帧的功能?,python,pandas,Python,Pandas,给定如下数据帧: |------|-------| |col1 |col2 | |------|-------| |a1 |abc | |a2 |bcd | |a3 |kfs | |------|-------| 是否有一个函数可以有效地将实际数据帧的行数大于10.000行创建为一个矩阵,如下所示,并使用自定义函数确定数值字段值 |------|-------|------|-------| | |a1 |a2 |a3

给定如下数据帧:

|------|-------|
|col1  |col2   |
|------|-------|
|a1    |abc    |
|a2    |bcd    |
|a3    |kfs    |
|------|-------|
是否有一个函数可以有效地将实际数据帧的行数大于10.000行创建为一个矩阵,如下所示,并使用自定义函数确定数值字段值

|------|-------|------|-------|
|      |a1     |a2    |a3     |
|------|-------|------|-------|
|a1    |1.000  |0.362 |0.643  |
|a2    |0.362  |1.000 |0.364  |
|a3    |0.643  |0.364 |1.000  |
|------|-------|------|-------|
到目前为止我所做的尝试:

将数据帧转换为列表并使用嵌套列表。然而,这在性能方面花费的时间太长了。 使用sklearn pairwise_distance,将自定义函数定义为度量。这里也有同样的性能问题。 最终,将生成以下表示:

|------|--------------------------------------|
|a1    |{a1: 1.000}, {a2: 0.362}, {a3: 0.643} |
|a2    |{a1: 0.362}, {a2: 1.000}, {a3: 0.364} |
|a3    |{a1: 0.643}, {a2: 0.364}, {a3: 1.000} |
|------|--------------------------------------|

一种方法是在col1的所有可能值之间创建一个叉积,对每一对进行计算,然后旋转:

# dummy data
df = pd.DataFrame({
    "col1": [f"a_{i}" for i in range(5)], 
    "col2": range(5)})

# the following dataframe is produced. We're now looking for a way to 
# run some calculation for each combination of col1 x col1
  col1  col2
0  a_0     0
1  a_1     1
2  a_2     2
3  a_3     3
4  a_4     4

df = pd.merge(df.assign(dummy=1), df.assign(dummy=1), on = "dummy").drop("dummy", axis=1)
df["res"] = df.col2_x * df.col2_y
pd.pivot_table(df, index="col1_x", columns="col1_y", values = "res")
结果是:

col1_y  a_0  a_1  a_2  a_3  a_4
col1_x                         
a_0       0    0    0    0    0
a_1       0    1    2    3    4
a_2       0    2    4    6    8
a_3       0    3    6    9   12
a_4       0    4    8   12   16

试试numpy outer?谢谢!但是,我如何将numpy EXTER与自定义函数一起使用呢?我见过它用于向量乘法和加法/减法,但这里我们看的是比较两个字符串。第一个数据帧(带abc、bcd等的数据帧)和第二个数据帧(带数字的数据帧)之间的关系如何?这些数字是从哪里来的?第二个应该是交叉应用的结果。我觉得我错过了第一个数据帧本身的正确术语。当你做df.dotdt.T时,你会得到什么样的结果示例中选择的数字是任意的,但是i.r.l.是否会由使用wmd-relax的单词移动距离产生。是的,这很有效,谢谢!这仍然是缓慢的一面,但我的猜测是,大规模杀伤性武器的结果是缓慢的