合并Dataframe alonside并重命名列

时间:2018-06-07 17:00:53

标签: python pandas

c:/ somepath包含以下文件

  

file1 file2 file3

来自" c:/ somepath /",我正在捕获名为users的列表中的所有文件名

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 :(得分:1)

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将索引的第二级(即用户)展开到列中。

答案 1 :(得分:0)

你需要:

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)