Почему порядок столбцов изменяется при добавлении pandas данных?
Я хочу добавить (слить) все файлы csv в папку с помощью Python pandas.
Например: папка Say имеет два файла csv test1.csv
и test2.csv
следующим образом:
A_Id P_Id CN1 CN2 CN3
AAA 111 702 709 740
BBB 222 1727 1734 1778
и
A_Id P_Id CN1 CN2 CN3
CCC 333 710 750 750
DDD 444 180 734 778
Итак, питон script, который я написал, был следующим:
#!/usr/bin/python
import pandas as pd
import glob
all_data = pd.DataFrame()
for f in glob.glob("testfolder/*.csv"):
df = pd.read_csv(f)
all_data = all_data.append(df)
all_data.to_csv('testfolder/combined.csv')
Несмотря на то, что combined.csv
имеет все добавленные строки, он выглядит следующим образом:
CN1 CN2 CN3 A_Id P_Id
0 710 750 750 CCC 333
1 180 734 778 DDD 444
0 702 709 740 AAA 111
1 1727 1734 1778 BBB 222
Где это должно выглядеть так:
A_ID P_Id CN1 CN2 CN2
AAA 111 702 709 740
BBB 222 1727 1734 1778
CCC 333 110 356 123
DDD 444 220 256 223
- Почему первые два столбца переместились в конец?
- Почему он добавляется в первую строку, а не в последнюю строку?
Что мне не хватает? И как я могу получить получение 0s и 1s в первом столбце?
P.S: Поскольку это большие файлы csv, я думал об использовании pandas.
Ответы
Ответ 1
Я изменил код, как показано ниже. Комментарии в строке.
#!/usr/bin/python
import pandas as pd
import glob
# Grab all the csv files in the folder to a list.
fileList = glob.glob('input_folder/*.csv')
#Initialize an empty dataframe to grab the csv content.
all_data = pd.DataFrame()
#Initialize an empty list to grab the dataframes.
dfList= []
for files in fileList:
df = pd.read_csv(files, index_col = None, header= False)
dfList.append(df)
#The frames will be in reverse order i.e last read file content in the begining. So reverse it again
Reversed_dfList = dfList[::-1]
CombinedFrame = pd.concat(Reversed_dfList)
# The "Combined.csv" file will have combination of all the files.
CombinedFrame.to_csv('output_folder/Combined.csv', index=False)
Ответ 2
Попробуйте это.....
all_data = all_data.append(df)[df.columns.tolist()]
Ответ 3
У меня была такая же проблема, и это было больно. Мне удалось решить эту проблему путем реорганизации столбцов на основе исходного фрейма после того, как он был добавлен в конечный файл данных. Это будет выглядеть так:
#!/usr/bin/python
import pandas as pd
import glob
all_data = pd.DataFrame()
for f in glob.glob("testfolder/*.csv"):
df = pd.read_csv(f)
all_data = all_data.append(df)
all_data = all_data[df.columns]
all_data.to_csv('testfolder/combined.csv')
Так как ваш вопрос был почти два года назад, я отправляю решение, которое работало для меня для других, кто также столкнется с подобной проблемой.
Ответ 4
Вы можете использовать переиндексацию, чтобы перейти к исходному порядку:
all_data = all_data.append(df)
all_data = all_data.reindex(df.columns, axis=1)
Я видел это здесь (более подробно в ссылке): https://github.com/pandas-dev/pandas/issues/4588#issuecomment-44421883
Ответ 5
Начиная с версии 0.23.0, вы можете запретить методу append()
сортировать окончательно добавленный DataFrame. В твоем случае:
all_data = all_data.append(df, sort=False)