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

1

Я пытаюсь взять фрейм данных, перебирать каждый столбец, начиная со второго, и копировать первый столбец констант + следующий по одному на новый фреймворк.

df = pd.DataFrame({'Year':[2001 ,2002, 2003, 2004, 2005], 'a': [1,2, 3, 4, 5], 'b': [10,20, 30, 40, 50], 'c': [0.1, 0.2, 0.3, 0.4,0.5]})
df

Чтобы получить результат, похожий на то, что это выводит, но мне нужно, чтобы он работал в цикле, так как у меня может быть до 40 столбцов для запуска логики.

df_a=pd.DataFrame()
df_a=df[['Year', 'a']].copy()
df_b=df[['Year', 'b']].copy()
df_c=df[['Year', 'c']].copy()
print(df_a)
print(df_b)
print(df_c)

Было бы неплохо, если бы я знал, как назвать df _ ['имя столбца, который он копирует']. Большое вам спасибо и извините, если это дубликат.

Теги:
pandas
dataframe
loops

3 ответа

2

Я предлагаю расщепить его через понимание dict, тогда у вас будет словарь ваших отдельных фреймов данных. Например:

dict_of_frames = {f'df_{col}':df[['Year', col]] for col in df.columns[1:]}

Дает вам словарь df_a, df_b и df_c, доступ к которому вы можете получить, как и любой другой словарь:

>>> dict_of_frames['df_a']
   Year  a
0  2001  1
1  2002  2
2  2003  3
3  2004  4
4  2005  5

>>> dict_of_frames['df_b']
   Year   b
0  2001  10
1  2002  20
2  2003  30
3  2004  40
4  2005  50
  • 0
    Большое вам спасибо @sacul! Еще один вопрос, поэтому, если мне нужно перебрать эти кадры, я должен сделать: для i в диапазоне (1, len (df.columns [4:]): finaldf = {dict_of_frames ['df_ {col}'] для столбца в df.columns [4:]} ???
  • 0
    Я не совсем уверен, что вы имеете в виду, но я бы повторил, сказав: for df in dict_of_frames.keys(): dict_of_frames[df] ...
Показать ещё 1 комментарий
1

Вам нужно сделать словарь данных, как показано ниже, с именем столбца в качестве ключа и subdataframe в качестве значения.

df = df.set_index('Year')
dict_ = {col: df[[col]].reset_index() for col in df.columns}

Вы можете просто использовать имя столбца для доступа к словарю и получения соответствующего фрейма данных.

dict_['a']

Выход:

    Year    a
0   2001    1
1   2002    2
2   2003    3
3   2004    4
4   2005    5

Вы можете перебирать dict_:

for col, df in dict_.items():
    print("-"*40) #just for separation
    print(df) #or print(dict_[col])

Выход:

----------------------------------------
   Year  a
0  2001  1
1  2002  2
2  2003  3
3  2004  4
4  2005  5
----------------------------------------
   Year   b
0  2001  10
1  2002  20
2  2003  30
3  2004  40
4  2005  50
----------------------------------------
   Year    c
0  2001  0.1
1  2002  0.2
2  2003  0.3
3  2004  0.4
4  2005  0.5
  • 1
    Еще раз, мы заканчиваем тем же самым основным ответом!
  • 1
    Вы отправили x секунд до меня. Я думаю, я должен быть быстрым. @sacul. :П
Показать ещё 4 комментария
0

Вам не нужно создавать словарь для копирования и доступа к требуемым данным. Вы можете просто скопировать свой фреймворк (глубокая копия, если у вас есть изменяемые элементы), а затем использовать индексирование для доступа к определенной серии:

dfs = df.set_index('Year').copy()

print(dfs['a'])

Year
2001    1
2002    2
2003    3
2004    4
2005    5
Name: a, dtype: int64

Вы можете перебирать столбцы через pd.DataFrame.iteritems:

for key, series in dfs.iteritems():
    print(key, series)

Да, это дает ряд, но их можно легко преобразовать в series.reset_index() через series.reset_index() или series.to_frame().

  • 0
    Спасибо, @jpp - это хорошая альтернатива!

Ещё вопросы

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