如何在 Pandas Dataframe 上加速 `for` 循环

How to speed up `for` loop on Pandas Dataframe

我有一个 Pandas 数据框,如下所示:

import pandas as pd
dist_temp = {'ID': {0: '110000', 1: '120000', 2: '130100', 3: '130200', 4: '130300'},
 '110000': {0: 0.0,
  1: 26359.35546663972,
  2: 7041.465835419961,
  3: 6748.88597016984,
  4: 4499.648549689056},
 '120000': {0: 25359.55546817345,
  1: 0.0,
  2: 2684.5583355637195,
  3: 16072.930316000879,
  4: 2573.60624992548},
 '130100': {0: 7203.651673447513,
  1: 2933.7008133762006,
  2: 0.0,
  3: 2278.794996954,
  4: 1022.7509126175601},
 '130200': {0: 7532.764214042125,
  1: 17598.85692679548,
  2: 2303.3769962313604,
  3: 0.0,
  4: 8356.33354580892},
 '130300': {0: 4123.111378129952,
  1: 2726.5461773558404,
  2: 1047.53770945992,
  3: 7946.337752637479,
  4: 0.0}}
df = pd.DataFrame(dist_temp)

有没有办法加快以下例程:

df_1 = pd.DataFrame(columns = ['IDo', 'IdD', 'flux'])
for i in range(0,len(df.columns)-1):
    j =0
    for x in df.itertuples():
        df_1 = df_1.append({'IDo': df.columns[i+1], 'IdD': x[j+1],'flux': x[i+2]}, ignore_index = True)
    j = j+1
df_1['flux'] = df_1['flux'].fillna(0)
print (df_1)

所需的输出如上所示,在这种情况下,第二列的标题 (110000) 在输出 Dataframe 中作为行 (0-4) 和前五行 (0-4) 中的 IDo ) 在值为 110000、12000、130100、130200、130300 的输入数据框中以 IdD 形式出现在输出数据框中(这是输出数据框中的第二列)。输出 Dataframe 中的第三列(通量)有助于对应于输入 Dataframe 中的交叉点的值,例如 0.000000 是 110000(第 1 列输入数据帧的标题)和 110000(第二行的数字)时的交叉点值,26359.355467是 110000(第 1 列数据框的标题)和 120000(第二行的数字)等时的值。

对于小型Dataframe这种方法没有问题。但是对于 500 rows x 500 columns Dataframe 来说,它需要花费大量时间。

抱歉这个天真的问题,我是 Pandas 的新手。

谢谢

Pandas 有很多重塑数据框的好选择。

在这种情况下,DataFrame.melt 很方便:

df.melt(id_vars="ID", value_name="Flux", var_name="IDo")

对于前 10 行,我得到:


       ID     IDo          Flux
0  110000  110000      0.000000
1  120000  110000  26359.355467
2  130100  110000   7041.465835
3  130200  110000   6748.885970
4  130300  110000   4499.648550
5  110000  120000  25359.555468
6  120000  120000      0.000000
7  130100  120000   2684.558336
8  130200  120000  16072.930316
9  130300  120000   2573.606250