Заполнение информационного кадра pandas с увеличением смещения столбца для каждой строки

1

Я пытаюсь создать кадр данных pandas, где каждая строка заполняется одним и тем же набором значений, но начальный столбец для каждой строки увеличивается на 1 для каждой строки, итерации по файловому кадру. Вот мой нынешний подход и пример кадра данных, который я надеялся получить. Что я здесь делаю неправильно?

Спасибо!

import pandas as pd
import numpy as np

df_to_fill = pd.DataFrame(data=np.zeros((4,6)),columns=[1,2,3,4,5,6])

values_to_fill = pd.Series(np.arange(1,4))

# vars to iterate over dataframe
num_rows = len(df_to_fill)
# counter to keep track of how many columns to offset from to fill dataframe in loop below
col_offset = 0

for row in range(0,num_rows):
    # Fill the first row from first column onwards, 2nd from 2nd column onwards,...
    df_to_fill.iloc[row,col_offset:] = values_to_fill
    # Fill the remaining columns in the row with the last value from the values to fill series
    df_to_fill.iloc[row,:].fillna(values_to_fill.values[-1],inplace=True)    
    col_offset += 1

offset_array = np.array([[1,2,3,3,3,3],[0,1,2,3,3,3],[0,0,1,2,3,3]])
desired_df = pd.DataFrame(data=offset_array,columns=[1,2,3,4,5,6])
Теги:
pandas
dataframe
numpy

2 ответа

1
Лучший ответ

Вы можете создать свое значение заливки так же, как в первой строке, мы используем shift + concat

values_to_fill = pd.Series(np.arange(1,4),index=np.arange(1,4)).reindex(np.arange(1,7)).ffill().astype(int)

pd.concat([values_to_fill.shift(x) for x in range(num_rows)],axis = 1 ).T.fillna(0)
     1    2    3    4    5    6
0  1.0  2.0  3.0  3.0  3.0  3.0
1  0.0  1.0  2.0  3.0  3.0  3.0
2  0.0  0.0  1.0  2.0  3.0  3.0
3  0.0  0.0  0.0  1.0  2.0  3.0
  • 1
    Прекрасно работает в моем фактическом наборе данных для тех строк, которые находятся близко к нижней части df, где длина значений для заполнения меньше доступных столбцов после применения shift (offset)
1

Используя понимание списка:

A = [1, 2, 3, 3, 3, 3]

res = pd.DataFrame([A] + [[0]*i + A[:-i] for i in range(1, 3)],
                   columns=range(1, 7))

print(res)

   1  2  3  4  5  6
0  1  2  3  3  3  3
1  0  1  2  3  3  3
2  0  0  1  2  3  3
  • 0
    Мне очень нравится такой подход, и я пытался проголосовать, но пока не набрал достаточного количества очков. Ваш ответ на самом деле помог мне лучше понять использование списочных представлений, поскольку я пытался научиться этому недавно. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню