在Docs上看到
不指定以获取所有工作表。
无->所有工作表都作为DataFrames的字典
我有一个包含4个工作表的Excel电子表格,分别名为place_one,place_two,place_tree,place_four
所以,如果我这样使用read_excel:
dfs_collection = pd.read_excel(excel_file, sheet_name=None)
然后致电:
dfs_collection.keys()
结果将是:
odict_keys(['place_one', 'place_two', 'place_tree', 'place_four'])
由于所有工作表都具有相同的变量,因此我可以将DF连接起来:
concatenated = pd.concat([dfs_collection.get('place_one'),
dfs_collection.get('place_two'),
dfs_collection.get('place_tree'),
dfs_collection.get('place_four')])
但是通过这种方式,我无法(或无法找到一种方法)来识别观测的起源。
一种进行硬编码的方法是:
df_one = dfs_collection.get('place_one')
df_one['place'] = 'place_one'
...
df_four = dfs_collection.get('place_four')
df_four['place'] = 'place_four'
然后:
concatenated = pd.concat([df_one,..., df_four])
哪个可以正常工作,但是看起来很丑,并且要求我事先知道纸页的数量和纸页的名称。
要实现这一目标,pythonic或更漂亮的方法是什么?
答案 0 :(得分:0)
由于pd.read_excel()
与sheet_name=None
返回了OrderedDict
,因此您只需执行以下操作即可将其直接传递给pd.concat()
:
df = pd.concat(pd.read_excel('test.xlsx', sheet_name=None, header=None))
这允许将任意数量的工作表串联到一个MultiIndex数据框中,而无需事先指定数量。请注意,由于我的示例Excel文件不包含列标题,因此我正在使用header=None
。请参见下面一张纸的屏幕截图(我的文件有四张纸,其名称为['place_one','place_two','place_three','place_four']
):
然后df
对应于:
0 1
place_four 0 a 1
1 b 2
2 c 3
3 d 4
4 e 5
5 f 6
place_one 0 a 1
1 b 2
2 c 3
3 d 4
4 e 5
5 f 6
place_three 0 a 1
1 b 2
2 c 3
3 d 4
4 e 5
5 f 6
place_two 0 a 1
1 b 2
2 c 3
3 d 4
4 e 5
5 f 6
然后我可以这样查询,因为它是一个MultiIndex数据框:
df.loc[pd.IndexSlice['place_four',:], :]
哪个给:
0 1
place_four 0 a 1
1 b 2
2 c 3
3 d 4
4 e 5
5 f 6
答案 1 :(得分:0)
在您的pd.concat
通话的每个项目中考虑assign
:
长格式
concatenated = pd.concat([dfs_collection.get('place_one').assign(place = 'place_one'),
dfs_collection.get('place_two').assign(place = 'place_two'),
dfs_collection.get('place_tree').assign(place = 'place_tree'),
dfs_collection.get('place_four').assign(place = 'place_four')])
简短列表,具有列表理解功能
concatenated = pd.concat([d.assign(place = k) for k, d in dfs_collection.items()])