Python 什么';在pandas read\u excel()上使用sheet\u name=None将多个工作表连接到数据框中的正确方法是什么?

Python 什么';在pandas read\u excel()上使用sheet\u name=None将多个工作表连接到数据框中的正确方法是什么?,python,excel,pandas,Python,Excel,Pandas,如图所示 指定“无”以获取所有图纸 无->所有工作表作为数据帧字典 我有一个Excel电子表格,有4张表格,分别命名为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', 'pla

如图所示

指定“无”以获取所有图纸

无->所有工作表作为数据帧字典

我有一个Excel电子表格,有4张表格,分别命名为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'])
由于所有工作表都有相同的变量,我可以将DFs与以下内容连接起来:

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或更漂亮的方法来实现这一点?

因为
pd.read\u excel()
with
sheet\u name=None
返回一个
OrderedDict
,您可以通过简单的操作将其直接传递到
pd.concat()

df = pd.concat(pd.read_excel('test.xlsx', sheet_name=None, header=None))
这允许将任意数量的工作表连接到单个多索引数据帧中,而无需事先指定数量。请注意,我使用的是
header=None
,因为我的示例Excel文件不包括列标题。请参见下面一张页面的屏幕截图(我的文件有四张页面,名称如下
['place\u one'、'place\u two'、'place\u three'、'place\u 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
考虑到它是一个多索引数据帧,我可以这样查询:

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
在您的
pd.concat
通话的每个项目中考虑:

长格式

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

你所说的观察结果的来源是什么意思?我指的是观察结果(行)的来源表,即示例上的位置1,位置2。你需要添加一些样本数据,否则很难理解情况。另外,你问题的标题与你正在讨论的问题不太匹配谢谢你的反馈@Yuca,我承认这个问题的框架很糟糕。因为它有一个解决问题的答案,我将更改标题以更好地适应这个问题。