根据某些条件合并Excel工作表

时间:2019-02-04 02:41:15

标签: python pandas

我在一个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

1 个答案:

答案 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

希望有帮助