Данные конкатенации в фрейме данных - PullRequest
0 голосов
/ 07 мая 2020

Привет, следующий код дает мне данные только из последнего файла. Возникла проблема с concat или for l oop. Я читаю данные из 2 файлов. каждая должна содержать около 350 строк по 3 столбца, которые соответствуют условию для l oop. Таким образом, в конце кадра данных должно получиться почти 700 на 3 кадра данных. но он показывает только данные из последнего файла.

import glob
from pathlib import Path

path = Path(r'C:\Users\PC\Desktop\datafiles')
filenames = path.glob('*.txt')
toconcat = []
for i in filenames:
    data1 = pd.read_csv(i, sep="\t", header=None)
    data1.columns = ['number','ab','cd','as','sd','dfg']
    dataset1 = pd.DataFrame(data1.loc[data1.number==1,['number','ab','cd']])
    toconcat.append(dataset1)

result = pd.concat(toconcat)
result

Но когда я использовал result.shape, он показывает 700 на 3, в чем проблема?

1 Ответ

0 голосов
/ 07 мая 2020

Я создал даже «более широкий» пример, передав также ключи параметр («маркер происхождения»).

Исходный файл Input_1.txt :

1   ab1 cd1 as1 sd1 dfg1
1   ab2 cd2 as2 sd2 dfg2
1   ab3 cd3 as3 sd3 dfg3
2   ab4 cd4 as4 sd4 dfg4

Исходный файл Input_2.txt :

1   ab5 cd5 as5 sd5 dfg5
1   ab6 cd6 as6 sd6 dfg6
1   ab7 cd7 as7 sd7 dfg7
2   ab8 cd8 as8 sd8 dfg8

(оба вышеуказанных файла разделены табуляцией).

И код:

toconcat = []
keys = []
path = Path(r'C:\Users\...')  # Replace dots with your path
filenames = path.glob('*.txt')
for i in filenames:
    data1 = pd.read_csv(i, sep='\t', names=['number', 'ab', 'cd', 'as', 'sd', 'dfg'])
    dataset1 = data1.loc[data1.number==1, ['number', 'ab', 'cd']]
    toconcat.append(dataset1)
    keys.append(i.stem)
result = pd.concat(toconcat, keys=keys)
print(result)

Обратите внимание, что имена столбцов можно передавать уже в read_csv (как и я).

Результат для моих входных файлов:

           number   ab   cd
Input_1 0       1  ab1  cd1
        1       1  ab2  cd2
        2       1  ab3  cd3
Input_2 0       1  ab5  cd5
        1       1  ab6  cd6
        2       1  ab7  cd7

Итак, ваш код выглядит нормально. Мой код отличается только в той детали, что результат содержит MultiIndex, причем верхний уровень показывает происхождение каждой строки, что упрощает отслеживание происходящего.

Попробуйте только мой код и мои входные файлы, результат должен быть таким же, как у меня.

Затем замените один из моих файлов вашим (и запустите код). Наконец, замените второй файл my на свой второй и снова запустите код.

Наконец, удалите параметр keys , чтобы в результате появился обычный индекс.

Вероятно источник вашей ошибки находится где-то в другом месте.

Кстати: вам не нужно import glob , поскольку вы используете glob from path только.

...