gpt4 book ai didi

python - Pandas:解析 Excel 中的合并标题列

转载 作者:行者123 更新时间:2023-12-02 04:17:35 24 4
gpt4 key购买 nike

Excel表格中的数据存储方式如下:

   Area     |          Product1     |      Product2        |      Product3
| sales|sales.Value| sales |sales.Value | sales |sales.Value
Location1 | 20 | 20000 | 25 | 10000 | 200 | 100
Location2 | 30 | 30000 | 3 | 12300 | 213 | 10

产品名称是给定月份 1000 个左右区域中每一个区域的两行“销售数量”和“销售值(value)”的 2 个单元格的合并。同样,过去 5 年的每个月都有单独的文件。此外,新产品在不同月份添加和删除。因此,不同月份的文件可能如下所示:

   Area     |          Product1     |      Product4        |      Product3

论坛能否建议使用 pandas 读取此数据的最佳方法?我无法使用索引,因为产品列每个月都不同

理想情况下,我想将上面的初始格式转换为:

 Area      | Product1.sales|Product1.sales.Value| Product2.sales |Product2.sales.Value | 
Location1 | 20 | 20000 | 25 | 10000 |
Location2 | 30 | 30000 | 3 | 12300 |
<小时/>
import pandas as pd
xl_file = read_excel("file path", skiprow=2, sheetname=0)
/* since the first two rows are always blank */


0 1 2 3 4
0 NaN NaN NaN Auto loan NaN
1 Branch Code Branch Name Region No of accounts Portfolio Outstanding
2 3000 Name1 Central 0 0
3 3001 Name2 Central 0 0

我想将其转换为 Auto Loan.No of accountAuto Loan.Portfolio Outstanding 作为标题。

最佳答案

假设您的 DataFrame 是 df:

import numpy as np
import pandas as pd

nan = np.nan
df = pd.DataFrame([
(nan, nan, nan, 'Auto loan', nan)
, ('Branch Code', 'Branch Name', 'Region', 'No of accounts'
, 'Portfolio Outstanding')
, (3000, 'Name1', 'Central', 0, 0)
, (3001, 'Name2', 'Central', 0, 0)
])

使它看起来像这样:

             0            1        2               3                      4
0 NaN NaN NaN Auto loan NaN
1 Branch Code Branch Name Region No of accounts Portfolio Outstanding
2 3000 Name1 Central 0 0
3 3001 Name2 Central 0 0

然后首先向前填充前两行中的 NaN(从而传播“Auto例如,“贷款”)。

df.iloc[0:2] = df.iloc[0:2].fillna(method='ffill', axis=1)

接下来用空字符串填充剩余的 NaN:

df.iloc[0:2] = df.iloc[0:2].fillna('')

现在用 . 将两行连接在一起,并将其指定为列级别值:

df.columns = df.iloc[0:2].apply(lambda x: '.'.join([y for y in x if y]), axis=0)

最后,删除前两行:

df = df.iloc[2:]

这会产生

  Branch Code Branch Name   Region Auto loan.No of accounts  \
2 3000 Name1 Central 0
3 3001 Name2 Central 0

Auto loan.Portfolio Outstanding
2 0
3 0
<小时/>

或者,您可以创建 MultiIndex 列而不是创建平面列索引:

import numpy as np
import pandas as pd

nan = np.nan
df = pd.DataFrame([
(nan, nan, nan, 'Auto loan', nan)
, ('Branch Code', 'Branch Name', 'Region', 'No of accounts'
, 'Portfolio Outstanding')
, (3000, 'Name1', 'Central', 0, 0)
, (3001, 'Name2', 'Central', 0, 0)
])
df.iloc[0:2] = df.iloc[0:2].fillna(method='ffill', axis=1)
df.iloc[0:2] = df.iloc[0:2].fillna('Area')

df.columns = pd.MultiIndex.from_tuples(
zip(*df.iloc[0:2].to_records(index=False).tolist()))
df = df.iloc[2:]

现在df看起来像这样:

         Area                           Auto loan                      
Branch Code Branch Name Region No of accounts Portfolio Outstanding
2 3000 Name1 Central 0 0
3 3001 Name2 Central 0 0

该列是多索引:

In [275]: df.columns
Out[275]:
MultiIndex(levels=[[u'Area', u'Auto loan'], [u'Branch Code', u'Branch Name', u'No of accounts', u'Portfolio Outstanding', u'Region']],
labels=[[0, 0, 0, 1, 1], [0, 1, 4, 2, 3]])

该列有两个级别。第一级的值为 [u'Area', u'Auto Loan'],第二级的值为 [u'Branch Code', u'Branch Name', u'No of Accounts ', u'投资组合杰出', u'地区']

然后,您可以通过指定两个级别的值来访问列:

print(df.loc[:, ('Area', 'Branch Name')])
# 2 Name1
# 3 Name2
# Name: (Area, Branch Name), dtype: object

print(df.loc[:, ('Auto loan', 'No of accounts')])
# 2 0
# 3 0
# Name: (Auto loan, No of accounts), dtype: object

使用多索引的一个优点是您可以轻松选择具有特定级别值的所有列。例如,要选择与汽车贷款有关的子DataFrame,您可以使用:

In [279]: df.loc[:, 'Auto loan']
Out[279]:
No of accounts Portfolio Outstanding
2 0 0
3 0 0

有关从多重索引中选择行和列的更多信息,请参阅 MultiIndexing Using Slicers .

关于python - Pandas:解析 Excel 中的合并标题列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27420263/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com