#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