![](/img/trans.png)
[英]How to split/slice a Pandas dataframe into multiple dataframes by column value?
[英]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.