Как транспонировать определенные столбцы на основе условия в Python 2.7 - PullRequest
0 голосов
/ 11 мая 2018

У меня есть следующий формат данных в файле:

ID,var_name,var_value
1,ABC,This is abc1
1,DEF,This is def1
2,ABC,This is abc2
2,DEF,This is def2
2,GHI,This is ghi2
3,ABC,This is abc3
4,ABC,This is abc4
4,DEF,This is def4

также у меня есть список заголовков = ['ABC','GHI']

В указанном выше наборе данных каждый "ID" не обязательноиметь все переменные, однако ID:2 содержит максимальное количество переменных (ABC, DEF, GHI).Мне нужно преобразовать вышеуказанный набор данных в следующий формат вложенного списка:

[['ID','ABC','GHI'], [1,'This is abc1', ''],[2, 'This is abc2','This is ghi2'],[3,'This is abc3',''],[4,'This is abc4','']]

Это означает, что список должен:

  • заполнить данные для всех идентификаторов
  • создать пустую строку для тех переменных, которых нет в указанном выше наборе данных.
  • заполнить вложенный список, поддерживая тот же порядок, что и в списке заголовков
  • заполнить только те значения заголовка, т.е. список заголовковимеет только значения 'ABC', 'GHI', поэтому вложенный список должен заполнять только значения 'ABC' и 'GHI' и игнорировать строки 'DEF' из указанного набора данных.

Я хочусделать это в Python 2.7, возможно используя Pandas.

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Использование:

L = ['ABC','GHI']

df1 = df.pivot('ID', 'var_name', 'var_value').fillna('')[L].reset_index()
print (df1)
var_name  ID           ABC           GHI
0          1  This is abc1              
1          2  This is abc2  This is ghi2
2          3  This is abc3              
3          4  This is abc4     

L1 = [df1.columns.tolist()] + df1.values.tolist()
print (L1)

[['ID', 'ABC', 'GHI'], 
 [1, 'This is abc1', ''], 
 [2, 'This is abc2', 'This is ghi2'],
 [3, 'This is abc3', ''], 
 [4, 'This is abc4', '']]

Объяснение :

  1. Сначала pivot, заменить NaN s на fillna, преобразовать подмножество для фильтрации столбцов и создать столбец из индекса по reset_index
  2. Последнее создание вложенного списка и имена последних вставленных столбцов

РЕДАКТИРОВАТЬ:

Я пытаюсь изменить порядок значений в списке:

L = ['GHI', 'ABC']
df1 = df.pivot('ID', 'var_name', 'var_value').fillna('')[L].reset_index()
print (df1)
var_name  ID           GHI           ABC
0          1                This is abc1
1          2  This is ghi2  This is abc2
2          3                This is abc3
3          4                This is abc4

L1 = [df1.columns.tolist()] + df1.values.tolist()
print (L1)

[['ID', 'GHI', 'ABC'],
 [1, '', 'This is abc1'], 
 [2, 'This is ghi2', 'This is abc2'], 
 [3, '', 'This is abc3'], 
 [4, '', 'This is abc4']]
0 голосов
/ 11 мая 2018

Кроме того, вы можете просто установить multiindex и unstack:

In []:
L = ['ABC', 'GHI']
df = df.set_index(['ID', 'var_name'])['var_value'].unstack(fill_value='')[L].reset_index()
df

Out[]:
var_name  ID           ABC           GHI
0          1  This is abc1              
1          2  This is abc2  This is ghi2
2          3  This is abc3              
3          4  This is abc4              

In []:
[df.columns.tolist()] + df.values.tolist()

Out[]:
[['ID', 'ABC', 'GHI'],
 [1, 'This is abc1', ''],
 [2, 'This is abc2', 'This is ghi2'],
 [3, 'This is abc3', ''],
 [4, 'This is abc4', '']]
0 голосов
/ 11 мая 2018

Я думаю, вы должны попытаться остаться в кадре данных этой прекрасной панды

df2=(df.pivot(index='ID', columns='var_name', values='var_value')
     .fillna('').drop('DEF', axis=1).reset_index())



#output:
var_name  ID           ABC           GHI
0          1  This is abc1              
1          2  This is abc2  This is ghi2
2          3  This is abc3              
3          4  This is abc4                

Но вы также можете пойти дальше, чтобы получить список:

print([df2.columns.tolist()] + df2.values.tolist())

[['ID', 'ABC', 'GHI'], 
[1, 'This is abc1', ''], 
[2, 'This is abc2', 'This is ghi2'], 
[3, 'This is abc3', ''], 
[4, 'This is abc4', '']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...