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的单词移动距离产生。是的,这很有效,谢谢!这仍然是缓慢的一面,但我的猜测是,大规模杀伤性武器的结果是缓慢的