Разделение одного кадра данных Pandas на несколько CSV-файлов с заранее заданным соглашением об именах - PullRequest
0 голосов
/ 06 ноября 2018

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

Пример оригинального CSV приведен ниже.

date     place  type    product value   zone
09/10/16 NY     Zo      shirt   19       1
09/10/16 NY     Mo      jeans   18       2
09/10/16 CA     Zo      trouser 13       3
09/10/16 CA     Co      tie     17       4
09/10/16 WA     Wo      bat     11       1
09/10/16 FL     Zo      ball    12       2
09/10/16 NC     Mo      belt    13       3
09/10/16 WA     Zo      buckle  15       4
09/10/16 WA     Co      glass   16       1
09/10/16 FL     Zo      cup     19       2

Мне нужно разбить этот массивный кадр данных панд на несколько кадров данных панд на основе места, типа и зоны, а выходные кадры данных должны быть преобразованы в несколько файлов CSV с соглашением об именах place_type_product_zone.csv.

Код, который я получил до сих пор, как показано ниже.

def list_of_dataframes(df, col_list):
    df_list = [df]
    name_list = []
    for _, i in enumerate(col_list):
        df_list, names = _split_dataframes(df_list, i)

file_name = zip(name_list, df)
_ = dict(zip(names, df))
for k, v in _:
    v.to_csv("{0}.csv".format(k))

Print("CSV files created")
return df, file_name


def _split_dataframes(df_list, col):
    names = []
    dfs = []
    for df in df_list:
        for c in df[col].unique():
            dfs.append(df.loc[df[col] == c])
            names.append(c)
    return dfs, names

list_of_dataframes(df,['place','type','zone']

Он выводит CSV-файлы с заголовком 1.csv, 2.csv и т. Д. Как создать цикл в функции, чтобы получить соглашение об именах, например NY_zo_shirt_1.csv, CA_Zo_trouser_3.csv и т. Д., Если я должен создать словарь, в котором он хранит все ключи?

Заранее спасибо.

1 Ответ

0 голосов
/ 06 ноября 2018

Вот оно -

# Part 1
places = df['place'].unique()
types = df['type'].unique()
products = df['product'].unique()
zones = df['zone'].unique()

# Part 2
import itertools
combs = list(itertools.product(*[places, types, products, zones]))

#Part 3
for comb in combs:
    place, type_, prod, zone = comb
    df_subset = df[(df['place']==place) & (df['type']==type_) & (df['product']==prod) & (df['zone']==zone)]
    if df_subset.shape[0] > 0:
        df_subset.to_csv('temp1/{}_{}_{}_{}.csv'.format(place, type_, prod, zone), index=False)

выход

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...