#python #pandas #dataframe #multidimensional-array
Вопрос:
Я хочу:
- Считывание файла во фрейм данных
- Выполните некоторые манипуляции с данными и т. Д.
- Скопируйте один столбец из фрейма данных
- Добавьте этот столбец во второй кадр данных
- Повторяйте 1-4, пока все файлы не будут прочитаны
Моя реализация заключается в:
all_data = [[]] #list to store each set of values for i in file_list: filepath = path i df=pd.read_csv(filepath,sep='t',header=None,names=colsList) #various data manipulation, melt, etc, etc, etc. all_data.append(df['value']) df_all = pd.DataFrame(all_data) df_all=df_all.T #Transpose df_all.set_axis(name_list, axis=1, inplace=True) #fix the column names
Как это можно было бы лучше реализовать?
Проблемы:
- данные в списке python транспонируются (добавляются строками, а не столбцами)
- Я не смог найти способ добавления по столбцам или переноса списка (с помощью списка python или с пандами), который работал бы без ошибок 🙁
Заранее спасибо…
Комментарии:
1. сначала вы могли бы использовать
print()
, чтобы увидеть, что у вас есть в переменной после чтения файла. возможно, вам следует перенести каждый df перед добавлениемall_data
. Или, может быть, вам следует проверить другие методы объединения/объединения кадров данных. Фрейм данных долженjoin()
добавлять столбцы.2. если бы вы использовали словарь
{"col1": df['value'], ...}
вместоlist
тогоpd.DataFrame(all_data)
, чтобы создавать столбцы
Ответ №1:
Если бы вы хранили данные, dictionary
то получили бы столбцы.
Но для каждой колонки нужно имя uniq — т. е. col1
, col2
, ect.
import pandas as pd all_data = {} all_data['col1'] = [1,2,3] all_data['col2'] = [4,5,6] all_data['col3'] = [7,8,9] new_df = pd.DataFrame(all_data) print(new_df)
Результат:
col1 col2 col3 0 1 4 7 1 2 5 8 2 3 6 9
То же самое с for
-loop
Я использую io.StringIO
только для имитации файлов в памяти, но вы должны использовать прямой путь к файлу.
import pandas as pd import io file_data = { 'file1.csv': '1t101n2t102n3t103', 'file2.csv': '4t201n5t202n6t202', 'file3.csv': '7t301n8t301n9t201', } file_list = [ 'file1.csv', 'file2.csv', 'file3.csv', ] # --- all_data = {} for number, i in enumerate(file_list, 1): df = pd.read_csv( io.StringIO(file_data[i]), sep='t', header=None, names=['value', 'other'] ) all_data[f'col{number}'] = df['value'] new_df = pd.DataFrame(all_data) print(new_df)
Вы также можете напрямую назначить новый столбец
new_df[f'column1'] = old_df['value']
import pandas as pd import io file_data = { 'file1.csv': '1t101n2t102n3t103', 'file2.csv': '4t201n5t202n6t202', 'file3.csv': '7t301n8t301n9t201', } file_list = [ 'file1.csv', 'file2.csv', 'file3.csv', ] # --- new_df = pd.DataFrame() for number, i in enumerate(file_list, 1): df = pd.read_csv( io.StringIO(file_data[i]), sep='t', header=None, names=['value', 'other'] ) new_df[f'col{number}'] = df['value'] print(new_df)