在熊猫read_excel()上使用sheet_name = None来连接数据帧中的多个图纸的正确方法是什么?

时间:2018-08-23 16:39:28

标签: python excel pandas

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或更漂亮的方法是什么?

2 个答案:

答案 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']):

enter image description here

然后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()])