如何从单个数据帧切片和创建多个数据帧

2024-04-19 23:18:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用pandas读取excel文件。我想从原始数据帧创建多个数据帧。每个数据帧名称应为第1行标题。另外,如何在每个事务之间跳过一列

预期结果:

transaction_1:
name id available capacity completed all

transaction_2:
name id available capacity completed all

transaction_3:
name id available capacity completed all

我尝试的是:

import pandas as pd
import pprint as pp
pd.options.display.width = 0
pd.options.display.max_columns = 999
pd.options.display.max_rows = 999
df = pd.read_excel(r'capacity.xlsx', sheet_name='Sprint Details', header=0)
df1 = df.iloc[:, 0:3]
print(df1)

enter image description here


Tags: 数据nameimportidpandasasdisplayall
1条回答
网友
1楼 · 发布于 2024-04-19 23:18:51

您可以尝试以下方法(与pd.__version__ == 1.1.1一起使用):

df = (pd.read_excel(
          "capacity.xlsx", sheet_name="Sprint Details", header=[0, 1], index_col=[0, 1]
       )
      .dropna(axis=1, how="all")
      .rename_axis(index=["name", "id"], columns=[None, None]))

transaction_1 = df["transaction_1"].reset_index()
transaction_2 = df["transaction_2"].reset_index()
transaction_3 = df["transaction_3"].reset_index()

本质上,我们需要将工作表作为具有多索引的数据帧读入。前两行是我们的列名header=[0,1]。而前两列是我们的索引,将用于每个“子表”index_col=[0,1]

因为每个表中都有空格,所以我们将有完全为NaN的列,所以我们将删除带有.dropna(axis=1, how="all")的列

因为pandas不希望索引名和列在同一行中,所以它应该错误地将索引列名["name", "id"]解析为第二级列index的名称。为了解决这个问题,我们可以手动分配正确的索引名,同时通过rename_axis(index=["name", "id"], columns=[None, None])删除列索引名

现在我们有了一个具有MultiIndex列的格式良好的表,我们可以简单地将每个表切掉,并对每个表调用.reset_index(),以确保每个表中都有"name""id"


编辑:看来我们的熊猫版本在语法分析上有所不同

选项1。 如果可以直接修改excel工作表以包含另一行(以便更好地将列与索引名分开)。这将提供最可靠的结果。 enter image description here

以下代码起作用:

df = (pd.read_excel(
          "capacity.xlsx", sheet_name="Sprint Details", header=[0, 1], index_col=[0, 1]
       )
      .dropna(axis=1, how="all"))

transaction_1 = df["transaction_1"].reset_index()
transaction_2 = df["transaction_2"].reset_index()
transaction_3 = df["transaction_3"].reset_index()

选项2

如果您不能修改excel文件,很遗憾,我们需要一种更迂回的方法

df = pd.read_excel("capacity.xlsx", header=[0,1]).dropna(axis=1, how="all")
index = pd.MultiIndex.from_frame(df.iloc[:, :2].droplevel(0, axis=1))

df = df.iloc[:, 2:].set_axis(index)

transaction_1 = df["transaction_1"].reset_index()
transaction_2 = df["transaction_2"].reset_index()
transaction_3 = df["transaction_3"].reset_index()

相关问题 更多 >