Сохранить фрейм данных изнутри для цикла - PullRequest
1 голос
/ 22 мая 2019

У меня есть функция, которая принимает dataframe и возвращает (уменьшенное) dataframe, например, вот так:

def transforming_data(dataframe, col_1, col_2, normalized = True):
    ''' takes in dataframe, groups col_1 according to col_2 and returns dataframe
    '''
    df = dataframe[col_1].groupby(dataframe[col_2]).value_counts(normalize = normalized).unstack(fill_value = 0)

    return dataframe

Для следующего кода это дает мне:

import pandas as pd
import numpy as np
np.random.seed(12)

def transforming_data(df, col_1, col_2, normalized = True):
    ''' takes in df, groups col_1 according to col_2 and returns df '''
    df = dataframe[col_1].groupby(dataframe[col_2]).value_counts(normalize = normalized).unstack(fill_value = 0)
    return df

numrows = 1000
dataframe = pd.DataFrame({'Numerical': np.random.randn(numrows), 
                         'Category': np.random.choice(['Panda', 'Elephant', 'Anaconda'], numrows),
                         'Response 1': np.random.choice(['Yes', 'Maybe', 'No', 'Don\'t know'], numrows),
                         'Response 2': np.random.choice(['Very Much', 'Much', 'A bit', 'Not at all'], numrows)})

test = transforming_data(dataframe, 'Response 1', 'Category')
print(test)
# Output
# Response 1  Don't know     Maybe        No       Yes
# Category                                            
# Anaconda      0.275229  0.232416  0.217125  0.275229
# Elephant      0.220588  0.270588  0.255882  0.252941
# Panda         0.258258  0.222222  0.273273  0.246246

Пока все хорошо.

Теперь я хочу использовать функцию transforming_data внутри цикла for для каждого столбца в dataframe (как у меня естьмного столбцов, а не только два), и сохраните результирующий кадр данных в новом кадре данных, например, test_response_1 и test_response_2 для этого примера.

Может кто-то указать мне правильное направление - то есть, как реализоватьцикл правильно?

Пока что я использую что-то вроде этого - но не могу понять, как сохранить фрейм данных

for column in dataframe.columns.tolist():
    temp_df = transforming_data(dataframe, column, 'Category')
    # here, I need to save tmp_df outside of the loop but don't know how to

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

Ответы [ 2 ]

1 голос
/ 22 мая 2019

Если вы хотите сохранить (в памяти) все temp_df из вашего цикла, вы можете добавить их в список, который затем можете проиндексировать:

temp_dfs = []
for column in dataframe.columns.tolist(): #you don't actually need the tolist() method here
    temp_df = transforming_data(dataframe, column, 'Category')
    temp_dfs.append(temp_df)

Если вы предпочитаетеиметь возможность доступа к этим temp_df по имени столбца, которое использовалось для их преобразования, затем вы можете назначить каждый словарь, используя столбец в качестве ключа:

temp_dfs = {}
for column in dataframe.columns.tolist():
    temp_df = transforming_data(dataframe, column, 'Category')
    temp_dfs[column] = temp_df

If by "save«Вы имели в виду« запись на диск », тогда вы можете использовать один из многих to_<file_format>() методов, которые предоставляет pandas:

temp_dfs = {}
for column in dataframe.columns.tolist():
    temp_df = transforming_data(dataframe, column, 'Category')
    temp_df.to_csv('temp_df{}.csv'.format(column))

Вот to_csv() документы .

1 голос
/ 22 мая 2019

Самое простое решение - сохранить результирующие данные в виде списка.Предполагая, что все столбцы, которые вы хотите зациклить, имеют текст Response в названии их столбца:

result_dframes = []
for col_name in dataframe.filter(like='Response').columns:
    result_dframe = transforming_data(dataframe, col_name, 'Category')
    result_dframes.append(result_dframe)

В качестве альтернативы вы также можете получить точно такой же результат с списком цикла for:

result_dframes = [
    transforming_data(dataframe, col_name, 'Category')
    for col_name in dataframe.filter(like='Response')
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...