我有一个pandas数据框,其中列ARRIVAL_DELAY充满了不同的值(float64)。我想插入一个新列COMPENSATION根据ARRIVAL_DELAY的值来填充.
我想让它看起来像这样:
ARRIVAL_DELAY COMPENSATION
10 0
25 0
43 50
61 250
我想出了下面的代码,但它似乎根本不起作用(它在Jupyter笔记本上花费了几个小时,甚至没有完成任何事情)。此外,不显示任何错误或警告:
fdf.insert(13, 'COMPENSATION', 0)
compensacion = [0, 50, 100, 250, 500, 1000]
for row in fdf['ARRIVAL_DELAY']:
if row > 0 and row <= 15 : fdf['COMPENSATION'].add(compensacion[0])
elif row > 15 and row <= 30 : fdf['COMPENSATION'].add(compensacion[1])
elif row > 30 and row <= 60 : fdf['COMPENSATION'].add(compensacion[2])
elif row > 60 and row <= 120 : fdf['COMPENSATION'].add(compensacion[3])
elif row > 120 and row <= 180 : fdf['COMPENSATION'].add(compensacion[4])
else :fdf['COMPENSATION'].add(compensacion[5])
fdf.head(10)
我不明白怎么回事,有什么想法吗?
最后,我对Python有点陌生,所以如果有人有改进的想法,我将非常欢迎😃
谢谢!
这可以使用np来完成。选择优化后的代码
import pandas as pd
import numpy as np
df = pd.DataFrame({
'ARRIVAL_DELAY' : [10, 25, 30, 61]
})
condition_list = [
df['ARRIVAL_DELAY'].between(1, 15),
df['ARRIVAL_DELAY'].between(16, 30),
df['ARRIVAL_DELAY'].between(31, 60),
df['ARRIVAL_DELAY'].between(61, 120),
df['ARRIVAL_DELAY'].between(121, 180)
]
choice_list = [0, 50, 100, 250, 500]
df['COMPENSATION'] = np.select(condition_list, choice_list, 1000)
df
尽量避免遍历pandas数据框架的行。事实上,只有在万不得已的时候才这么做。Pandas和numpy提供了许多高度优化的矢量化函数。在大型数据帧上进行迭代可能会非常慢。(阅读本文了解更多)
numpy.select
是解决@ArchAngelPwn提供的问题的绝佳选择。另一种方法是使用pandas cut(),它可以将连续值存储到离散的区间,而且效率也很高。
df = pd.DataFrame([10, 25, 43, 61], columns=['ARRIVAL_DELAY'])
df['COMPENSATION'] = pd.cut(df.ARRIVAL_DELAY,
[0, 15, 30, 60, 120, 180, np.inf],
labels=[0, 50, 100, 250, 500, 1000])
print(df)
ARRIVAL_DELAY COMPENSATION
0 10 0
1 25 50
2 43 100
3 61 250