如何使用数据透视表并累积它们?

问题描述 投票:0回答:1

我有一个数据集,其中有两个目的地以及它们之间的距离!

城市1 城市2 距离
101 102 56
102 103 34
103 104 6
105 106 15
106 107 9
107 108 90

我想准备一个表,其中包含以city1为索引、以city2为列的累积距离!并且距离的值必须是累加和。 对角线元素也必须为 0!

尝试使用 cumsum 首先找到累积和,并将其添加为新列 -

df3['cs'] = np.cumsum(df3['distance'])

我尝试使用枢轴方法执行此操作。

pivot_table = df3.pivot(索引='city1',columns='city2',values='cs')

但是结果表有以下输出 output (CLICK HERE)

我想要对角线列为 0 的结果,其他列是累积和....

谁有解决办法吗?预先感谢!

python dataframe pivot data-science cumulative-sum
1个回答
0
投票

您发送的数据样本存在一个小问题。您似乎错过了从城市 104 到城市 105 的路线。

无论如何,这里有一个可能有帮助的 Python 代码。它计算数据集中城市之间的距离:

import pandas as pd
import numpy as np

# Sample data
data = {
    'city1': [101, 102, 103, 105, 106, 107],
    'city2': [102, 103, 104, 106, 107, 108],
    'distance': [56, 34, 6, 15, 9, 90]
}

# Create DataFrame
df = pd.DataFrame(data)

cities = df[['city1', 'city2']].values.flatten()

df_2 = pd.DataFrame(index=np.unique(cities), columns=list(cities))

# compute distance
combination_cities = np.array(np.meshgrid(cities, cities)).T.reshape(-1, 2)

def compute_distance(c1, c2):
    if c1>c2:
        c1,c2 = c2,c1
    if c1 == c2:
        return 0
    else:
        distances = {}
        destination_city=None
        from_city = c1
        while destination_city != c2:
            df_tmp = df[df['city1'] == from_city]
            if df_tmp.empty:
                return np.nan
            destination_city = df_tmp['city2'].values[0]
            distance = df_tmp['distance'].values[0]
            distances[destination_city] = distance
            from_city = destination_city
        return sum(distances.values())


for c1,c2 in combination_cities:
    distance = compute_distance(c1, c2)
    df_2.loc[c1, c2] = distance
    df_2.loc[c2, c1] = distance

# df_2 = df_2.fillna(0)
print(df_2)

© www.soinside.com 2019 - 2024. All rights reserved.