繁体   English   中英

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

[英]how to slice and create multiple pandas dataframes from a singe dataframe

我正在使用 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)

在此处输入图像描述

你可以试试这个(适用于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()

本质上,我们需要将工作表读取为带有 MultiIndex 的 dataframe。 前两行是我们的列名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"作为每个表中的列。


编辑:我们的 pandas 版本之间似乎存在解析差异。

选项 1。如果您可以直接修改 excel 工作表以包含另一行(以更好地将列与索引名称分开)。 这将提供最可靠的结果。 在此处输入图像描述

以下代码有效:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM