У меня возникли проблемы с преобразованием данных, которое я пытаюсь выполнить. У меня есть столбец данных (пример 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 — это строка. Я видел другие варианты переноса в другие ячейки, но я хочу, чтобы все значения были объединены и введены в одну ячейку. Любая помощь будет принята с благодарностью. Я также рассмотрел объединение, но оно похоже на стандартное объединение таблиц, а не на то, что я рассматривал, если только я не упускаю из виду его конкретную функциональность.
Одним из вариантов может быть использование numpy скользящего_окна_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
import pandas as pd
from numpy.lib.stride_tricks import sliding_window_view as swv
import numpy as np
data = {'Streak': np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])}
df = pd.DataFrame(data)
lookback = 3
aa =[ ''.join(str(val) for val in row )
if any(row) else np.nan
for row in swv(df['Streak'].astype(int).values,lookback)
]
print(aa)#['123', '234', '345', '456', '567', '678', '789']
df['Streak_History'] = [np.nan]*(lookback -1) + [
''.join(str(val) for val in row)
if any(row)
else np.nan
for row in swv(df['Streak'].astype(int).values,lookback)
]
print(df)
"""
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
"""
метод 2:
import pandas as pd
import numpy as np
data = {'Streak': np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])}
df = pd.DataFrame(data)
lookback = 3
def f(row):
if row.name < lookback -1 :return np.nan
else:
aa = ''.join(df['Streak'].iloc[row.name - lookback +1 : row.name +1 ].astype(str))
print(aa)
return aa
df['Streak_History'] = df.apply(f,axis=1)
print(df)
Пожалуйста, предоставьте реальный минимально воспроизводимый пример (входные данные + ожидаемый результат)