我在一个excel文件中有多个工作表,但我需要将它们合并到一个单独的excel工作表中,但要有一些条件。 该行应以4开头,并且在发现空白行的任何地方都应在该处中断以显示特定的工作表,并且索引不应在那里存在。我尝试使用以下代码:
import pandas as pd
all_data = []
data = pd.ExcelFile(local_path)
sheets = data.sheet_names
for sheet in sheets:
xl = data.parse(
sheet,
header=3,
index_col=None,
skiprows=None
)
all_data.append(xl)
pd.concat(all_data).to_csv(destination)
,但它也包含空白行之后的数据。请提出建议。
请查找示例数据框及其连接的数据框
工作表1:
A B C
1 2 3
4 5 6
这不应该包括在内,在此空白行之前
工作表2:
A B C
7 8 9
10 11 12
这不应该包括在内,在此空白行之前
连接的数据框应如下所示:
A B C
1 2 3
4 5 6
7 8 9
10 11 12
答案 0 :(得分:1)
据我所知,主要问题是如何在空白行上分割并仅保留数据帧的第一部分(因为连接代码似乎是正确的)。
因此,如果有一些空白行的excel文件,它将被读取为:
A B C
0 1.0 2.0 3.0
1 4.0 5.0 6.0
2 NaN NaN NaN
3 10.0 11.0 12.0
4 13.0 14.0 15.0
-空行将转换为NaN
(示例floats
中有dataframe
,而不是整数,因为它包含NaN
,并且类型已更改为float)。可以根据条件“其中所有值均等于NaN的行进行拆分” 。
获取此类行的索引值:
nan_rows = df.index[df.isna().all(axis=1)]
nan_rows
Out:
Int64Index([2], dtype='int64')
具有该属性的第一行的数字索引为:
first_nan_row = nan_rows[0]
-2
这种情况。注意,它应该是一个数字唯一索引。如果没有这种东西,请通过df = df.reset_index()
添加它,然后再将其删除。
获得行号后,使用它通过iloc
分割数据帧:
df_before_blank_line = df.iloc[:first_nan_row]
df_before_blank_line
Out:
A B C
0 1.0 2.0 3.0
1 4.0 5.0 6.0
完整代码示例:
import pandas as pd
all_data = []
data = pd.ExcelFile(local_path)
sheets = data.sheet_names
for sheet in sheets:
xl = data.parse(
sheet,
header=2,
index_col=None,
skiprows=None
)
nan_rows = xl.index[xl.isna().all(axis=1)]
first_nan_row = nan_rows[0]
xl = xl.iloc[:first_nan_row] # drop the lines after blank line here
xl['sheet_name'] = sheet # I recommend to add a sheet name to distinguish sheets later
all_data.append(xl)
pd.concat(all_data).to_csv(destination)
输出应如下所示:
A B C sheet_name
0 1.0 2.0 3.0 Sheet1
1 4.0 5.0 6.0 Sheet1
0 1.0 2.0 3.0 Sheet2
1 4.0 5.0 6.0 Sheet2
最后一列是可选的(当然,您可以将其删除,也可以将列中的dtype
更改为int
-如果没有更多的NaN's
)
希望有帮助