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列已重命名为"用户名"
有人可以告诉我实现这一结果的最简单方法。
答案 0 :(得分:1)
IIUC:
pd.concat(pd.read_fwf(f, index_col=[0, 1]).squeeze() for f in users).unstack()
我将这些文件放入我的目录
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)