Изменение формы / поворот файла данных пар ключ-значение с повторяющимися значениями ключа - PullRequest
0 голосов
/ 25 сентября 2018

Я нашел много вопросов с таким же названием, но не смог найти именно тот, который искал.

У меня есть такой файл данных:

title1:A1
title2:A2
title3:A3
title4:A4
title5:A5

title1:B1
title2:B2
title3:B3
title4:B4
title5:B5

title1:C1
title2:C2
title3:C3
title4:C4
title5:C5

title1:D1
title2:D2
title3:D3
title4:D4
title5:D5

Используя панд, я бы хотелполучить такую ​​таблицу:

    title1  title2  title3  title4  title5
0   A1  A2  A3  A4  A5
1   B1  B2  B3  B4  B5
2   C1  C2  C3  C4  C5
3   D1  D2  D3  D4  D5

Моя попытка:

import pandas as pd
import numpy as np

df = pd.read_csv('colon_sep.txt',header=None,sep=':')
df.columns = ['title','id']

# for loop method
df2 = pd.DataFrame()
for t in df.title.unique():
    df2[t] = df[df.title == t]['id'].values
df2
# HOW TO GET THIS BY Advanced methods?

Мне удалось получить нужную таблицу, используя цикл for.

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

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

После того, как вы выполните

df = pd.read_csv('colon_sep.txt',header=None,sep=':')

Вы можете сделать

df= pd.DataFrame({name:list(column[0]) for name,column in dfc.groupby(dfc.index)})

Или, если у вас есть данные в строке с именем text, вы можете сделать

df = pd.DataFrame([[line.split(':')[1] for line in lines.split('\n')] for lines in text.split('\n\n')])`

Имена столбцов можно получить с помощью

df.columns = [line.split(':')[0] for line in text.split('\n\n')[0].split('\n')]
0 голосов
/ 25 сентября 2018

Вы можете немного упростить свой код, добавив в конец вызов pivot для эффективности:

df = pd.read_csv('colon_sep.txt', sep=':', header=None)
df.insert(2, 2, df.groupby(0).cumcount())  
df = df.pivot(index=2, columns=0, values=1)

print(df)

0 title1 title2 title3 title4 title5
2                                   
0     A1     A2     A3     A4     A5
1     B1     B2     B3     B4     B5
2     C1     C2     C3     C4     C5
3     D1     D2     D3     D4     D5
...