Перебор фрейма данных и получение столбцов в качестве новых фреймов данных

#python #pandas #dataframe

Вопрос:

Я пытаюсь создать набор фреймов данных из одного большого фрейма данных. Эти фреймы данных состоят из столбцов исходного фрейма данных следующим образом: 1-й фрейм данных является 1-м столбцом исходного, 2-й фрейм данных является 1-м и 2-м столбцами исходного и так далее. Я использую этот код для перебора фрейма данных:

 for i, data in enumerate(x):
    data = x.iloc[:,:i]
    print(data)
 

Это работает, но я также получаю пустой фрейм данных в начале и вектор индекса, который мне не нужен.
есть какие-нибудь предложения о том, как удалить эти 2?

Спасибо

Ответ №1:

Вместо перечисления фрейма данных, поскольку вы не используете результат после перечисления, а используете только значение индекса, вы можете просто выполнить итерацию в range 1 по количеству добавленных столбцов , затем взять срез df.iloc[:, :i] для каждого значения i , вы можете использовать понимание списка для достижения этой цели.

 >>> [df.iloc[:, :i] for i in range(1,df.shape[1] 1)]
[  A
0  1
1  2
2  3,    
   A  B
0  1  2
1  2  4
2  3  6]
 

Эквивалентный традиционный цикл будет выглядеть примерно так:

 for i in range(1,df.shape[1] 1):
    print(df.iloc[:, :i])
    
   A
0  1
1  2
2  3
   A  B
0  1  2
1  2  4
2  3  6
 

Комментарии:

1. большое спасибо за помощь! у меня есть еще один вопрос, хотя, что, если я хочу, чтобы он перемещал 2 столбца за раз вместо 1? я попытался изменить первую строку на 2, но она все равно прыгает по 1 за раз.

2. @OmerDavidi, затем вам нужно передать step параметр для range работы, измененный код будет выглядеть примерно так: [df.iloc[:, :i] for i in range(1,df.shape[1] 1, 2)]

Ответ №2:

вы также можете сделать что-то подобное:

 data = {
    'col_1': np.random.randint(0, 10, 5),
    'col_2': np.random.randint(10, 20, 5),
    'col_3': np.random.randint(0, 10, 5),
    'col_4': np.random.randint(10, 20, 5),
}
df = pd.DataFrame(data)

all_df = {col: df.iloc[:, :i] for i, col in enumerate(df, start=1)}

# For example we can print the last one
print(all_df['col_4'])
    col_1   col_2   col_3   col_4
0   1   13  5   10
1   8   16  1   18
2   6   11  5   18
3   3   11  1   10
4   7   14  8   12