将列中的一组滚动值转置为单元格中的单个值

问题描述 投票:0回答:1

我在尝试进行数据转换时遇到了麻烦。我有一列数据(例如 1,2,3,4,5,6,7,8,9)我想创建一个新列来回顾 n 行并将这些值连接成一个新值,最好是一个整数。例如,如果在我的示例中回溯窗口为 3,则新列将为 Nan, Nan, 123, 234,345,456,567,678,789。

到目前为止,这里是我尝试过的一些代码,其中 n 是回溯窗口,Streak 是数据帧,其中包含我希望组合成新值(streakHistory)的值:

def getStreakHistory(Streak, n=20):
    streakHistory= ""
    for x in range(1, n + 1):
         streakHistory=str(streakHistory) + str(Streak["Streak"].shift(x))
    return streakHistory

df["Streak History"] = getStreakHistory(Streak)

这似乎运行错误,因为 streakHistory 是一个字符串。我见过其他选项,您可以将其转置到其他单元格中,但我希望将所有值组合起来并输入到 1 个单元格中。任何帮助将不胜感激。我还研究了连接,但这似乎与标准表连接类似,并且与我所看到的并不完全相同,除非我忽略了它的特定功能。

python pandas dataframe transpose
1个回答
1
投票

一种选择是使用

sliding_window_view
agg
:

from numpy.lib.stride_tricks import sliding_window_view as svw

df = pd.DataFrame({'Streak': [1,2,3,4,5,6,7,8,9]})
N = 3

df['Streak History'] = (pd.DataFrame(svw(df['Streak'].astype(str), N),
                                     index=df.index[N-1:])
                          .agg(''.join, axis=1)
                       )

输出:

   Streak Streak History
0       1            NaN
1       2            NaN
2       3            123
3       4            234
4       5            345
5       6            456
6       7            567
7       8            678
8       9            789

数字变体:

df['Streak History'] = pd.Series((svw(df['Streak'], N)
                                  *(10**np.arange(N-1, -1, -1))).sum(1),
                                    index=df.index[N-1:])

输出:

   Streak  Streak History
0       1             NaN
1       2             NaN
2       3           123.0
3       4           234.0
4       5           345.0
5       6           456.0
6       7           567.0
7       8           678.0
8       9           789.0
© www.soinside.com 2019 - 2024. All rights reserved.