避免在数据帧中循环生成特征

2024-04-26 12:12:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一些代码,从数据帧生成特性,并将这些特性作为列添加到数据帧中。你知道吗

问题是,我使用的是一个时间序列,因此对于任何给定的元组,我需要(比方说)前面的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()创建几个滞后列,这样所有必要的信息都包含在每一行中,但是由于数据集很大(数百万行),这很快就会对我的计算机内存造成困难。你知道吗


Tags: 数据方法代码dfindex时间slicesome
1条回答
网友
1楼 · 发布于 2024-04-26 12:12:58

我没有足够的声誉发表评论,所以只会张贴在这里。你知道吗

你不能为你的数据帧使用apply吗

df['feature1']=数据框应用(someRowFunction,轴=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

相关问题 更多 >