我正在使用Pandas将一些来自数据库的数据导入到DataFrame对象中。 数据的格式如下:
time info from to frequency
19:00 ... A X 20
19:00 ... B Z 9
21:00 ... A Y 2
21:00 ... A Z 5
23:55 ... A X 8
现在我有两个问题需要解决:
独立计算从一点到另一点所有移动频率的总和,与时间无关,例如从A点到X点,此总和为28。因此,"时间"和"键"都是可放弃的,在此情况下不需要它们。
由于我可以保证"from"中的所有点都与"to"中的点相同,因此我希望以某种形式将上述所提到的总和呈现为矩阵。
以下是我已经编写的代码:
import pandas as pd
def make_matrix(df: pd.DataFrame):
# Get grouped version, discarding date and info...
grouped = df.groupby(['from', 'to'])['frequency'].sum()
# Fill dictionary acting as matrix...
D = {}
for (_from, _to), freq in grouped.items():
if D.get(_from):
D[_from][_to] = int(freq)
else:
D[_from] = {}
为了提供背景信息,第一行将示例 DataFrame 转换为:
from to frequency
A X 28
Y 2
Z 5
B Z 9
事实上,我相信有更好的方法来做这件事情,但是我在StackOverflow或Google中找不到,因为这是一个非常特殊的情况。
另外,我正在寻找更好的方法,因为这个字典最终会没有每个点X到同一点X的None/0值。
我认为应该有一种更容易合并这些列的方法,而不是以grouped: pd.Series
的形式结束,因为必须遍历每个元组,如 (A,X),(A,Y),(A,Z)
等,并且还必须人为地将None添加到字典中(X,X)的简单情况中,感觉很糟糕...
编辑1:我正在添加所需的矩阵输出...... 应该类似于这样:
A B ... X Y Z
A null 0 ... 28 2 5
B 0 null ... 0 0 9
.
.
.
X 0 0 ... 0 0 0
Y 0 0 ... 0 0 0
Z 0 0 ... 0 0 0
此外,如果在矩阵位置M[X][A]中有另一个元组,例如从
X
到A
的频率为25,则该位置上会有0而不是25。
编辑2:
我可能索引错误,可能是转置矩阵而不是示例矩阵,无论哪种情况都存在问题,这是一个非对称的平方矩阵。
make_matrix
在我的端上实际上并不起作用。 - tdyfrom
矩阵,其中所有值都是A,B,X,Y,Z
,并且to
矩阵中所有值都是A,B,X,Y,Z
。 对于矩阵的行A到Z,列A到Z,你想要找到交点以显示频率。 类似这样,其中黄色部分为无,其余部分具有频率(如果存在)。 - Joe Ferndzdef
,我的错 :( - Kvothe