我有以下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': ['']}]
请注意,名称 2 是一个 4 合并行单元格,但 我在 df 中只得到一行。
那是因为 pandas 修剪了 openypxl返回的尾随空行。
作为解决方法,您可以从工作表中制作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]
(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': ['']}]