【发布时间】:2017-11-26 17:22:49
【问题描述】:
我有一个如下所示的数据框:
from random import randint
import pandas as pd
df = pd.DataFrame({"ID": ["a", "b", "c", "d", "e", "f", "g"],
"Size": [randint(0,9) for i in range(0,7)]})
df
ID Size
0 a 4
1 b 3
2 c 0
3 d 2
4 e 9
5 f 5
6 g 3
而我想要得到的是这个(也可以是一个矩阵):
sums_df
a b c d e f g
a 8.0 7.0 4.0 6.0 13.0 9.0 7.0
b 7.0 6.0 3.0 5.0 12.0 8.0 6.0
c 4.0 3.0 0.0 2.0 9.0 5.0 3.0
d 6.0 5.0 2.0 4.0 11.0 7.0 5.0
e 13.0 12.0 9.0 11.0 18.0 14.0 12.0
f 9.0 8.0 5.0 7.0 14.0 10.0 8.0
g 7.0 6.0 3.0 5.0 12.0 8.0 6.0
即,ID 中所有可能对的 Size 值的总和。
现在我有这个简单但低效的代码:
sums_df = pd.DataFrame()
for i in range(len(df)):
for j in range(len(df)):
sums_df.loc[i,j] = df.Size[i] + df.Size[j]
sums_df.index = list(df.ID)
sums_df.columns = list(df.ID)
对于像这样的小例子它工作得很好,但对于我的实际数据来说它太长了,我确信可以避免嵌套的 for 循环。你能想出一个更好的方法来做到这一点吗?
感谢您的帮助!
【问题讨论】:
-
只是好奇:你为什么需要它?
-
我有另一个数据框,我将其用作 NetworkX 的邻接矩阵(我们称之为 df1),我想将 df1 元素“除以” sums_df 以获得说 df2 。 df1 包含 ID 之间的公共元素的计数,但我也有每个 ID 中的元素数量(这里是 Size,ID 实际上是组的 ID)。这样,我与 df2 一起使用的权重是公共元素的份额,而不是使用 df1 作为邻接矩阵的公共元素的计数。我希望这已经足够清楚了!