我正在编写一些代码,从数据框生成特性,并将这些特性作为列添加到数据框中。
问题是我正在处理一个时间序列,因此对于任何给定的元组,我需要(比方说)前5个元组为该元组生成相应的特性。
lookback_period = 5
df['feature1'] = np.zeros(len(df)) # preallocate
for index, row in df.iterrows():
if index < lookback_period:
continue
slice = df[index - lookback_period:index]
some_int = SomeFxn(slice)
row['feature1'] = some_int
有没有一种方法可以执行这段代码,而不必显式地遍历每一行,然后进行切片?
一种方法是使用
df['column_name'].shift()
创建多个滞后列,以便在每行中包含所有必需的信息,但由于数据集很大(数以百万计的行),这对我的计算机内存来说很快就会变得棘手。 最佳答案
我没有足够的声誉发表评论,所以将在这里张贴。
你不能用apply来表示你的数据帧吗。
DF[ [特征1 ] ]=DF.Apple(SoMeOw函数,轴=1)
其中someRowFunction将接受整行,您可以执行任何基于行的切片和逻辑。
---更新---
由于我们没有太多关于数据帧和所需/预期输出的信息,所以我只是根据注释中的信息来回答
让我们定义一个函数,它将获取一个数据帧片段(基于当前行索引和回溯)和该行,并返回该片段的第一列和当前行的值之和。
def someRowFunction (slice, row):
if slice.shape[0] == 0:
return 0
return slice[slice.columns[0]].sum() + row.b
d={'a':[1,2,3,4,5,6,7,8,9,0],'b':[0,9,8,7,6,5,4,3,2,1]}
df=pd.DataFrame(data=d)
lookback = 5
df['c'] = df.apply(lambda current_row: someRowFunction(df[current_row.name -lookback:current_row.name],current_row),axis=1)
我们可以使用apply的name属性从apply获取行索引,因此我们可以检索所需的片段。以上将导致以下结果
print(df)
a b c
0 1 0 0
1 2 9 0
2 3 8 0
3 4 7 0
4 5 6 0
5 6 5 20
6 7 4 24
7 8 3 28
8 9 2 32
9 0 1 36
关于python - 避免循环遍历 Pandas 数据框以生成特征,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47945972/