Объединить Dataframe отдельно и переименовать столбец - PullRequest
0 голосов
/ 07 июня 2018

c: / somepath содержит следующие файлы

file1 file2 file3

из "c: / somepath /", я фиксирую все имена файлов в спискевызываемые пользователи

users=[d for d in os.listdir("c:/somepath/") if os.path.isdir(os.path.join("c:/somepath/", d))]

Примечание: количество файлов в каталоге может отличаться, но данные в файле остаются в том же формате.

file1 содержится нижеданные

index   user name   %used
 1          a        25
 2          a        40
 3          a        20
 4          a        25

file2 содержит данные ниже

index   user name   %used
 1          b        33
 2          b        66
 3          b        20
 4          b        88

file3 содержит данные ниже

index   user name   %used
 1          c        25
 2          c        69
 3          c        20
 4          c        73

Мне нужен результат, как показано ниже

index     a     b    c
  1       25    33   25
  2       40    66   69
  3       20    20   20
  4       25    88   73

если вы видите результат, столбец% used был переименован в соответствующее «имя пользователя»

Может кто-нибудь подскажет, пожалуйста, самый простой способ достижения этого результата.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Вам нужно:

pd.concat([df1.set_index(['index', 'user_name']), df2.set_index(['index', 'user_name']), df3.set_index(['index', 'user_name'])], axis=1).unstack().dropna(1)
0 голосов
/ 07 июня 2018

IIUC:

pd.concat(pd.read_fwf(f, index_col=[0, 1]).squeeze() for f in users).unstack()

MCVE

Я поместил эти файлы в свой каталог

print(*(p.read_text() for p in Path('.').glob('file*')), sep='\n\n')

index   user name   %used
 1          a        25
 2          a        40
 3          a        20
 4          a        25

index   user name   %used
 1          b        33
 2          b        66
 3          b        20
 4          b        88

index   user name   %used
 1          c        25
 2          c        69
 3          c        20
 4          c        73

Затем я запустил приведенный выше код

from pathlib import Path

pd.concat(
    pd.read_fwf(f, index_col=[0, 1]).squeeze() for f in Path('.').glob('file*')
).unstack()

user name   a   b   c
index                
1          25  33  25
2          40  66  69
3          20  20  20
4          25  88  73

Объяснение

Я использую pandas read_fwf для чтения файла фиксированной ширины.Я устанавливаю первые два столбца как индексы и сжимаю результат.Это производит Series.Затем я использую pd.concat, чтобы поместить их друг на друга.После этого я использую unstack, чтобы развернуть второй уровень индекса (который является пользователем) в столбцы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...