Объединение и сохранение нескольких пар CSV в pandas

Я новичок в питоне. У меня есть сто пар CSV-файлов. Файл выглядит так:

25_13oct_speed_0.csv    
26_13oct_speed_0.csv
25_13oct_speed_0.1.csv
26_13oct_speed_0.1.csv
25_13oct_speed_0.2.csv
26_13oct_speed_0.2.csv
and others

Я хочу объединить пару файлов между 25 и 26 файлами. каждая пара файла имеет порог скорости (Speed_0, 0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9, 2.0), который указан в имени файла. Эти файлы имеют одинаковую структуру данных.

Mac Annotation  X   Y
A   first       0   0
A   last        0   0
B   first       0   0
B   last        0   0

Следовательно, конкатенации достаточно, чтобы соединить эти два данных. Я использую этот метод:

df1 = pd.read_csv('25_13oct_speed_0.csv')
df2 = pd.read_csv('26_13oct_speed_0.csv')
frames = [df1, df2]
result = pd.concat(frames)

для каждой пары файлов. но это требует времени и не элегантным способом. Есть ли хороший способ автоматически объединить файл пары и сохранить его одновременно?

Концептуально вы можете извлечь ключевые элементы, которые вы пытаетесь сопоставить (25/26 и 0/0.1/0.2/etc.), создать ключ на их основе, отсортировать имена .csv по этому ключу, а затем выполнить итерацию по ним для чтения и объединения, например пары фреймов данных.

Brendan 21.06.2019 17:59

спасибо @BrendanCox, я попытаюсь сделать ключ на основе имени файла

Arief 22.06.2019 04:44
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
113
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Идея состоит в том, чтобы создать DataFrame по списку файлов и добавить 2 новых столбца по Series.str.split первым _:

print (files)
['25_13oct_speed_0.csv', '26_13oct_speed_0.csv', 
 '25_13oct_speed_0.1.csv', '26_13oct_speed_0.1.csv', 
 '25_13oct_speed_0.2.csv', '26_13oct_speed_0.2.csv']

df1 = pd.DataFrame({'files': files})
df1[['g','names']] = df1['files'].str.split('_', n=1, expand=True)
print (df1)
                    files   g                names
0    25_13oct_speed_0.csv  25    13oct_speed_0.csv
1    26_13oct_speed_0.csv  26    13oct_speed_0.csv
2  25_13oct_speed_0.1.csv  25  13oct_speed_0.1.csv
3  26_13oct_speed_0.1.csv  26  13oct_speed_0.1.csv
4  25_13oct_speed_0.2.csv  25  13oct_speed_0.2.csv
5  26_13oct_speed_0.2.csv  26  13oct_speed_0.2.csv

Затем зациклить по группам на столбец names, зациклить по группам с DataFrame.itertuples и создать новый DataFrame с read_csv, при необходимости добавить новый столбец, заполненный значениями из g, добавить в список, concat и, наконец, перейти к новому файлу по имени из столбца names:

for i, g in df1.groupby('names'):
    out = []
    for n in g.itertuples():
        df = pd.read_csv(n.files).assign(source=n.g)
        out.append(df)
    dfbig = pd.concat(out, ignore_index=True)
    print (dfbig)
    dfbig.to_csv(g['names'].iat[0])

большое спасибо, этот ответ очень полезен для следующего шага моей работы. пардон, аут значит словарь?

Arief 22.06.2019 15:42

out - это список, сначала пустой, а затем заполненный кадрами данных.

jezrael 22.06.2019 17:48

Другие вопросы по теме