Транспонировать скользящий набор значений в столбце в одно значение в ячейке

У меня возникли проблемы с преобразованием данных, которое я пытаюсь выполнить. У меня есть столбец данных (пример 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 — это строка. Я видел другие варианты переноса в другие ячейки, но я хочу, чтобы все значения были объединены и введены в одну ячейку. Любая помощь будет принята с благодарностью. Я также рассмотрел объединение, но оно похоже на стандартное объединение таблиц, а не на то, что я рассматривал, если только я не упускаю из виду его конкретную функциональность.

Пожалуйста, предоставьте реальный минимально воспроизводимый пример (входные данные + ожидаемый результат)

mozway 16.05.2024 20:47
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
75
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Одним из вариантов может быть использование 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)    

Другие вопросы по теме