我在尝试进行数据转换时遇到了麻烦。我有一列数据(例如 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 个单元格中。任何帮助将不胜感激。我还研究了连接,但这似乎与标准表连接类似,并且与我所看到的并不完全相同,除非我忽略了它的特定功能。
一种选择是使用 numpy 的
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