使用合并单元格 Pandas 读取 Excel 文件

问题描述 投票:0回答:2

我有以下Excel文件

数据框是

     Name  Selector  Range  Policy
0  Name 1       NaN    NaN     NaN
1     NaN       NaN    NaN     NaN
2     NaN       NaN    NaN     NaN
3     NaN       NaN    NaN     NaN
4  Name 2       NaN    NaN     NaN

注意

Name 2
是一个 4 合并行单元格,但我在 df 中只得到一行。

from pprint import pprint

import pandas as pd

excel_data = pd.read_excel(io="pandas.xlsx", usecols="A:D")

df = pd.DataFrame(data=excel_data)

print(df)

data = (
    df.ffill()
    .fillna(value="")
    .groupby(by=df.columns[:1].to_list(), as_index=False)
    .aggregate(func=list)
    .rename(
        columns={
            df.columns[0]: "name",
            df.columns[1]: "selector",
            df.columns[2]: "range",
            df.columns[3]: "policy",
        }
    )
    .to_dict(orient="records")
)

pprint(data)

在终端中打印数据时,我得到以下输出

[{'name': 'Name 1',
  'policy': ['', '', '', ''],
  'range': ['', '', '', ''],
  'selector': ['', '', '', '']},
 {'name': 'Name 2', 'policy': [''], 'range': [''], 'selector': ['']}]

当除 A 列以外的所有列都为空时,有什么方法可以使

data
如下所示?

[{'name': 'Name 1', 'policy': [''], 'range': [''], 'selector': ['']},
 {'name': 'Name 2', 'policy': [''], 'range': [''], 'selector': ['']}]
python pandas openpyxl
2个回答
0
投票

请注意,名称 2 是一个 4 合并行单元格,但 我在 df 中只得到一行。

那是因为 pandas 修剪了 openypxl

作为解决方法,您可以从工作表中制作

DataFrame

 values
 :

from openpyxl import load_workbook data = load_workbook("pandas.xlsx")["Sheet1"].values header = next(data); df = pd.DataFrame(data, columns=header)
输出:

print(df) Name Selector Range Policy 0 Name 1 None None None 1 None None None None 2 None None None None 3 None None None None 4 Name 2 None None None 5 None None None None 6 None None None None 7 None None None None [8 rows x 4 columns]
    

0
投票
这可以解决您的问题吗:

(df[~df['name'].isna()] .fillna('') .to_dict(orient='records') )
输出:

[{'name': 'Name 1', 'selector': '', 'range': '', 'policy': ''}, {'name': 'Name 2', 'selector': '', 'range': '', 'policy': ''}]
它丢失了列表,但如果其他所有内容都是空的,我想这并不重要......

再想一想再编辑。 这应该可以解决问题:

(df.ffill() .fillna("") .groupby('name') .agg(lambda x: list(x.unique())) .reset_index() .to_dict(orient='records') )
输出:

[{'name': 'Name 1', 'selector': [''], 'range': [''], 'policy': ['']}, {'name': 'Name 2', 'selector': [''], 'range': [''], 'policy': ['']}]
    
© www.soinside.com 2019 - 2024. All rights reserved.