如何在 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
我有一个 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