Python Pandas Dataframe - 我的函数没有返回任何内容
Python Pandas Dataframe - Nothing being returned from my function
我有两个数据框:
energy_calculated(time_stamp 列仅使用 3 个十进制值进行格式化,以确保没有任何隐藏值破坏简单的数学运算):
fl_key min_time_stamp max_time_stamp energy
0 10051 1614556800019.000 1614556807979.000 0.352
1 10051 1614556808019.000 1614556815979.000 0.275
2 10051 1614556816019.000 1614556823979.000 0.429
3 10051 1614556824019.000 1614556831979.000 0.406
4 10051 1614556832019.000 1614556839979.000 0.444
5 10051 1614556840019.000 1614556847979.000 0.348
6 10051 1614556848019.000 1614556855979.000 0.381
7 10051 1614556856019.000 1614556863979.000 0.456
8 10051 1614556864019.000 1614556871979.000 0.362
9 10051 1614556872019.000 1614556879979.000 0.465
10 10051 1614556880019.000 1614556887979.000 0.577
11 10051 1614556888019.000 1614556895979.000 0.305
12 10051 1614556896019.000 1614556903979.000 0.347
13 10051 1614556904019.000 1614556911979.000 0.246
14 10051 1614556912019.000 1614556919939.000 0.340
df_test:
fl_Key time_stamp energy install_prediction
1007 10051 1614556840299 -1 -1
491 10051 1614556819659 -1 -1
1944 10051 1614556877779 -1 -1
2227 10051 1614556889099 -1 -1
677 10051 1614556827099 -1 -1
2944 10051 1614556917779 -1 -1
799 10051 1614556831979 -1 -1
2378 10051 1614556895139 -1 -1
1877 10051 1614556875099 -1 -1
487 10051 1614556819499 -1 -1
我正在尝试从 df_test 数据帧中查找 fl_Key 和 time_stamp,使用它们从 energy_calculated 数据帧中查找“能量”值. fl_Key 到 fl_key 列应该完全匹配。 time_stamp 列应位于最小和最大 time_stamp 列之间。
fl_Key 和 fl_key 名称不同,因此我可以跟踪哪个列来自哪里。
我有一个简单的方法(我放入引发异常只是为了确保它总能找到匹配项):
def integrateEnergyCalculationData(row, energy_calculations):
energy_calculations = energy_calculations[(energy_calculations['fl_key'] == row.fl_Key) & (energy_calculations['min_time_stamp'] <= row.time_stamp) & (energy_calculations['max_time_stamp'] >= row.time_stamp)]
if (len(energy_calculations) == 0):
raise Exception("No energy data for: " + str(row.fl_Key) + ", " + str(row.time_stamp))
elif (len(energy_calculations) >= 2):
raise Exception("Too much energy data for: " + str(row.fl_Key) + ", " + str(row.time_stamp))
return energy_calculations['energy']
我使用 apply() 将它们连接在一起:
df_test['energy'] = df_test[['time_stamp','fl_Key']].apply(integrateEnergyCalculationData, 1, args=(energy_calculated, ))
最终发生的是映射是针对某些行而不是所有行进行的:
我生成的 df_test 数据框看起来像(我有一个更大版本的 df_test,但我已将其缩短为 10 行以演示该问题)。我从较大的版本中随机选择了 10 行——这就是索引号不正常的原因:
fl_Key time_stamp energy install_prediction
1007 10051 1614556840299 -1
491 10051 1614556819659 0.4291915384067029 -1
1944 10051 1614556877779 -1
2227 10051 1614556889099 -1
677 10051 1614556827099 -1
2944 10051 1614556917779 -1
799 10051 1614556831979 -1
2378 10051 1614556895139 -1
1877 10051 1614556875099 -1
487 10051 1614556819499 0.4291915384067029 -1
我错过了什么?谢谢。
这很奇怪。我把你的两个数据框变成了我自己的一个,运行 你的代码。转载你的差距。然后,我把 pdb
放在你的 return 语句之前,它是 returning 一个 object
,而不是一个浮点数!事实上,所有行都是对象。我把这一行:
return float(energy_calculations['energy'])
并获得了完整的数据框。
index fl_Key time_stamp energy install_prediction
0 1007 10051 1614556840299 0.348 -1
1 491 10051 1614556819659 0.429 -1
2 1944 10051 1614556877779 0.465 -1
3 2227 10051 1614556889099 0.305 -1
4 677 10051 1614556827099 0.406 -1
5 2944 10051 1614556917779 0.340 -1
6 799 10051 1614556831979 0.406 -1
7 2378 10051 1614556895139 0.305 -1
8 1877 10051 1614556875099 0.465 -1
9 487 10051 1614556819499 0.429 -1
Since I don't have access to your dataframes, maybe some type weirdness is going on that you should fix.
从头开始。您可以使用 energy_calculations['energy'].values[0]
实现相同的效果,而无需转换为浮点数。
尝试使用 merge
:
df_new = df_energy.rename(columns={'fl_key': 'fl_Key'})\
.merge(df_test[['fl_Key', 'time_stamp']], on='fl_Key', how='left')
print(df_new.loc[df_new['time_stamp']\
.between(df_new['min_time_stamp'], df_new['max_time_stamp']), 'energy'])
输出:
energy
21 0.429
29 0.429
34 0.406
36 0.406
50 0.348
92 0.465
98 0.465
113 0.305
117 0.305
145 0.34
我有两个数据框:
energy_calculated(time_stamp 列仅使用 3 个十进制值进行格式化,以确保没有任何隐藏值破坏简单的数学运算):
fl_key min_time_stamp max_time_stamp energy
0 10051 1614556800019.000 1614556807979.000 0.352
1 10051 1614556808019.000 1614556815979.000 0.275
2 10051 1614556816019.000 1614556823979.000 0.429
3 10051 1614556824019.000 1614556831979.000 0.406
4 10051 1614556832019.000 1614556839979.000 0.444
5 10051 1614556840019.000 1614556847979.000 0.348
6 10051 1614556848019.000 1614556855979.000 0.381
7 10051 1614556856019.000 1614556863979.000 0.456
8 10051 1614556864019.000 1614556871979.000 0.362
9 10051 1614556872019.000 1614556879979.000 0.465
10 10051 1614556880019.000 1614556887979.000 0.577
11 10051 1614556888019.000 1614556895979.000 0.305
12 10051 1614556896019.000 1614556903979.000 0.347
13 10051 1614556904019.000 1614556911979.000 0.246
14 10051 1614556912019.000 1614556919939.000 0.340
df_test:
fl_Key time_stamp energy install_prediction
1007 10051 1614556840299 -1 -1
491 10051 1614556819659 -1 -1
1944 10051 1614556877779 -1 -1
2227 10051 1614556889099 -1 -1
677 10051 1614556827099 -1 -1
2944 10051 1614556917779 -1 -1
799 10051 1614556831979 -1 -1
2378 10051 1614556895139 -1 -1
1877 10051 1614556875099 -1 -1
487 10051 1614556819499 -1 -1
我正在尝试从 df_test 数据帧中查找 fl_Key 和 time_stamp,使用它们从 energy_calculated 数据帧中查找“能量”值. fl_Key 到 fl_key 列应该完全匹配。 time_stamp 列应位于最小和最大 time_stamp 列之间。
fl_Key 和 fl_key 名称不同,因此我可以跟踪哪个列来自哪里。
我有一个简单的方法(我放入引发异常只是为了确保它总能找到匹配项):
def integrateEnergyCalculationData(row, energy_calculations):
energy_calculations = energy_calculations[(energy_calculations['fl_key'] == row.fl_Key) & (energy_calculations['min_time_stamp'] <= row.time_stamp) & (energy_calculations['max_time_stamp'] >= row.time_stamp)]
if (len(energy_calculations) == 0):
raise Exception("No energy data for: " + str(row.fl_Key) + ", " + str(row.time_stamp))
elif (len(energy_calculations) >= 2):
raise Exception("Too much energy data for: " + str(row.fl_Key) + ", " + str(row.time_stamp))
return energy_calculations['energy']
我使用 apply() 将它们连接在一起:
df_test['energy'] = df_test[['time_stamp','fl_Key']].apply(integrateEnergyCalculationData, 1, args=(energy_calculated, ))
最终发生的是映射是针对某些行而不是所有行进行的:
我生成的 df_test 数据框看起来像(我有一个更大版本的 df_test,但我已将其缩短为 10 行以演示该问题)。我从较大的版本中随机选择了 10 行——这就是索引号不正常的原因:
fl_Key time_stamp energy install_prediction
1007 10051 1614556840299 -1
491 10051 1614556819659 0.4291915384067029 -1
1944 10051 1614556877779 -1
2227 10051 1614556889099 -1
677 10051 1614556827099 -1
2944 10051 1614556917779 -1
799 10051 1614556831979 -1
2378 10051 1614556895139 -1
1877 10051 1614556875099 -1
487 10051 1614556819499 0.4291915384067029 -1
我错过了什么?谢谢。
这很奇怪。我把你的两个数据框变成了我自己的一个,运行 你的代码。转载你的差距。然后,我把 pdb
放在你的 return 语句之前,它是 returning 一个 object
,而不是一个浮点数!事实上,所有行都是对象。我把这一行:
return float(energy_calculations['energy'])
并获得了完整的数据框。
index fl_Key time_stamp energy install_prediction
0 1007 10051 1614556840299 0.348 -1
1 491 10051 1614556819659 0.429 -1
2 1944 10051 1614556877779 0.465 -1
3 2227 10051 1614556889099 0.305 -1
4 677 10051 1614556827099 0.406 -1
5 2944 10051 1614556917779 0.340 -1
6 799 10051 1614556831979 0.406 -1
7 2378 10051 1614556895139 0.305 -1
8 1877 10051 1614556875099 0.465 -1
9 487 10051 1614556819499 0.429 -1
Since I don't have access to your dataframes, maybe some type weirdness is going on that you should fix.
从头开始。您可以使用 energy_calculations['energy'].values[0]
实现相同的效果,而无需转换为浮点数。
尝试使用 merge
:
df_new = df_energy.rename(columns={'fl_key': 'fl_Key'})\
.merge(df_test[['fl_Key', 'time_stamp']], on='fl_Key', how='left')
print(df_new.loc[df_new['time_stamp']\
.between(df_new['min_time_stamp'], df_new['max_time_stamp']), 'energy'])
输出:
energy
21 0.429
29 0.429
34 0.406
36 0.406
50 0.348
92 0.465
98 0.465
113 0.305
117 0.305
145 0.34