#python-3.x #pandas
#python-3.x #pandas
Вопрос:
Я хочу использовать pandas для перемещения данных по текстовому файлу, чтобы пользователю было легко анализировать данные. Пока я могу импортировать несколько текстовых файлов и добавлять данные во фрейм данных вместе с добавлением заголовков. Что я хочу сделать, так это переместить данные в правильный столбец, но проблема в том, что все данные находятся в одном столбце.
Вот мои данные:
test2218
math-science-physics
00:00:00:00
00:00:30:00
03-21 04:00:00
28
test2228
math
00:00:00:00
00:00:30:00
03-21 04:00:00
26
test2317
reading-comprehension
00:00:00:00
00:00:30:00
03-21 20:02:00
Я хочу, чтобы мой вывод выглядел так:
Test ID Test Info Duration_A Duration_B Next Use Participants
test2218 math-science-physics 00:00:00:00 00:00:30:00 03-21 14:00:00 28
test2228 math 00:00:00:00 00:00:30:00 03-21 14:00:00 26
test2317 reading-comprehension 00:00:00:00 00:00:30:00 04-11 13:30:00 2
Я искал везде и не могу найти четкого ответа. Может кто-нибудь помочь?
Вот мой код до сих пор:
import os, glob, pandas as pd
d_frame = []
c_names = ['Test ID', 'Test Info', 'Duration_A', 'Duration_B', 'Next
Use', 'Participants']
files_list = glob.glob(os.path.join('C:\test', '*.txt'))
for file in files_list:
if os.stat(file).st_size != 0:
df = pd.read_csv(file, delimiter='t',header=None, names = c_names)
Любая информация об этом была бы весьма признательна. Заранее спасибо!
Комментарии:
1. является ли каждая строка записью в вашем одностолбцовом фрейме данных? и всегда ли это 6 единиц информации? ни один из них не пропал?
2. Похоже, что это действительно 6 в серии. На данный момент существует 6 текстовых файлов, которые объединены, и они имеют одинаковые / похожие данные в своей серии.
Ответ №1:
Предполагая, что ваши данные являются pandas.DataFrame
объектом, и эти 6 фрагментов информации всегда присутствуют в этом определенном порядке, вы можете попробовать:
df = pd.DataFrame({0: ['test2218', 'math-science-physics', '00:00:00:00', '00:00:30:00', '03-21 04:00:00', '28', 'test2228', 'math', '00:00:00:00', '00:00:30:00', '03-21 04:00:00', '26', 'test2317', 'reading-comprehension', '00:00:00:00', '00:00:30:00', '03-21 20:02:00']})
columns = ['Test ID', 'Test Info', 'Duration_A', 'Duration_B', 'Next Use', 'Participants']
df_new = pd.DataFrame(df.groupby(df.index // len(columns))[0].apply(list).values.tolist(), columns=columns)
print(df_new)
Test ID Test Info Duration_A Duration_B Next Use Participants
0 test2218 math-science-physics 00:00:00:00 00:00:30:00 03-21 04:00:00 28
1 test2228 math 00:00:00:00 00:00:30:00 03-21 04:00:00 26
2 test2317 reading-comprehension 00:00:00:00 00:00:30:00 03-21 20:02:00 None
Или в качестве альтернативы
df_new = pd.DataFrame(df.values.reshape(-1, len(columns)), columns=columns)
Комментарии:
1. Крис, спасибо за помощь!. Я применил ваш код
df_new
к своему коду и изменил список столбцов на тот, который у меня был (c_names). Это сработало отлично. Ты молодец!2. Рад, что это помогло, приятель 🙂
Ответ №2:
Вот простой способ сделать это с numpy.reshape
:
import numpy as np
import pandas as pd
pd.DataFrame(np.reshape(df.values, (len(df) // 6, 6)),
columns=['Test ID', 'Test Info', 'Duration_A', 'Duration_B', 'Next Use', 'Participants'])
Test ID Test Info Duration_A Duration_B Next Use Participants
0 test2218 math-science-physics 00:00:00:00 00:00:30:00 03-21 04:00:00 28
1 test2228 math 00:00:00:00 00:00:30:00 03-21 04:00:00 26
2 test2317 reading-comprehension 00:00:00:00 00:00:30:00 03-21 20:02:00 2
Ответ №3:
import pandas as pd
x= pd.Series(['test2218',
'math-science-physics',
'00:00:00:00',
'00:00:30:00',
'03-21 04:00:00',
'28',
'test2228',
'math',
'00:00:00:00',
'00:00:30:00',
'03-21 04:00:00',
'26',
'test2317',
'reading-comprehension',
'00:00:00:00',
'00:00:30:00',
'03-21 20:02:00',
'55'])
Перебирайте, чтобы найти необходимые индексы
indices = []
for i in range(6):
indices.append(list(range(i, len(x), 6)))
создайте список столбцов и пустой фрейм данных, затем выполните цикл для подмножества индексов и присвоите фрейму данных.
columns=['Test ID', 'Test Info', 'Duration_A', 'Duration_B', 'Next Use', 'Participants']
df = pd.DataFrame({})
for col, ixs in zip(columns, indices):
df[col] = x[ixs].reset_index(drop=True)