牛小牛
2023/03/09阅读:13主题:重影
对称矩阵转换
表格--三列式之间互转
加入我们有表格格式类似如下:
北 | 天 | 上 | 重 | 石 | 张 | 承 | 唐 | 秦 | |
---|---|---|---|---|---|---|---|---|---|
北 | 0 | 75 | 33 | 45 | 166 | 67 | 52 | 69 | 3 |
天 | 75 | 0 | 46 | 21 | 214 | 70 | 64 | 221 | 70 |
上 | 33 | 46 | 0 | 55 | 31 | 2 | 0 | 2 | 1 |
重 | 45 | 21 | 55 | 0 | 29 | 0 | 0 | 0 | 0 |
石 | 166 | 214 | 31 | 29 | 0 | 8 | 8 | 9 | 5 |
张 | 67 | 70 | 2 | 0 | 8 | 0 | 0 | 5 | 0 |
承 | 52 | 64 | 0 | 0 | 8 | 0 | 0 | 12 | 0 |
唐 | 69 | 221 | 2 | 0 | 9 | 5 | 12 | 0 | 19 |
秦 | 3 | 70 | 1 | 0 | 5 | 0 | 0 | 19 | 0 |
我们想把其转换成三列式:
source | target | value |
---|---|---|
北 | 天 | 75 |
北 | 上 | 334 |
北 | 重 | 45 |
北 | 石 | 166 |
那么怎么操作呢?
pandas库来读取Excel文件,并将其转换为三列式
import pandas as pd
# 读取Excel文件
df = pd.read_excel('网络.xlsx', index_col=0)
# 删除0距离值
df = df[df != 0].dropna(how='all').dropna(axis=1, how='all')
# 将表格转换为三列式
triplets = []
for row in df.index:
for col in df.columns:
if not pd.isna(df.loc[row, col]):
triplets.append([row, col, df.loc[row, col]])
# 将三列式保存到Excel文件中
triplets_df = pd.DataFrame(triplets, columns=['起始城市', '目标城市', '距离值'])
triplets_df.to_excel('network.xlsx', index=False)
此代码将读取名为“网络.xlsx”的Excel文件,并将其转换为三列式。它会删除距离值为0的条目,并将表格中的每个城市对之间的距离值作为一个单独的行添加到一个列表中。最后,它会将这个列表转换为一个新的pandas DataFrame,并将其保存到名为“network.xlsx”的Excel文件中。注意,我们设置了index=False
,以避免将DataFrame索引写入Excel文件中
在上述操作上怎么实现三列式转换对称矩阵呢?
使用Python和pandas库,可以将三列式转换为Excel文件中的表格格式
以下是一个示例代码:
import pandas as pd
# 读取三列式
df = pd.read_excel('三列式.xlsx')
# 将三列式转换为表格格式
pivot_table = df.pivot_table(index='起始城市', columns='目标城市', values='距离值')
# 将表格保存为Excel文件
pivot_table.to_excel('网络.xlsx')
此代码将读取名为“三列式.xlsx”的Excel文件,并将其转换为表格格式。它将使用起始城市和目标城市作为索引和列标签,并将距离值作为单元格值。最后,它会将表格保存到名为“网络.xlsx”的Excel文件中。
请注意,如果您在三列式中有重复的城市对,那么在使用pivot_table
方法时,您需要指定如何合并重复值。默认情况下,pivot_table
方法使用平均值来合并重复值,但是您可以使用aggfunc
参数来指定其他聚合函数,例如min
、max
或sum
。
但是我们发现生成时会有很多空值,那怎么把空值制动生成0呢?可以直接excel操作,但是具体代码怎么实现呢?
#在将三列式转换为表格格式时,如果缺少某些值,则可以使用fillna()方法将缺失值填充为0。
import pandas as pd
# 读取三列式
df = pd.read_excel('三列式.xlsx')
# 将三列式转换为表格格式,并将缺失值填充为0
pivot_table = df.pivot_table(index='起始城市', columns='目标城市', values='距离值').fillna(0)
# 将表格保存为Excel文件
pivot_table.to_excel('网络.xlsx')
此代码将读取名为“三列式.xlsx”的Excel文件,并将其转换为表格格式。它将使用起始城市和目标城市作为索引和列标签,并将距离值作为单元格值。然后,它使用fillna()
方法将缺失值填充为0。最后,它会将表格保存到名为“网络.xlsx”的Excel文件中。
请注意,如果您在三列式中有重复的城市对,那么在使用pivot_table
方法时,缺失的值将自动填充为NaN。因此,在将表格保存到Excel文件之前,需要使用fillna()
方法将NaN填充为0,以避免出现错误。
如果需要数据和代码的请关注我的WX:Jdaystudy
作者介绍