Sam*_*waj 6 python excel pandas read-data
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
Run Code Online (Sandbox Code Playgroud)
产品名称是给定月份的1000个左右区域中的每一个的两行"销售额"和"销售价值"的2个单元的合并.同样,过去5年每个月都有单独的文件.此外,新产品已在不同月份添加和删除.所以不同的月份文件可能如下所示:
Area | Product1 | Product4 | Product3
Run Code Online (Sandbox Code Playgroud)
论坛能否建议使用熊猫阅读此数据的最佳方式?我不能使用索引,因为每个月的产品列都不同
理想情况下,我想将上面的初始格式转换为:
Area | Product1.sales|Product1.sales.Value| Product2.sales |Product2.sales.Value |
Location1 | 20 | 20000 | 25 | 10000 |
Location2 | 30 | 30000 | 3 | 12300 |
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我想将其转换为Auto loan.No of account,Auto loan.Portfolio Outstanding作为头.
unu*_*tbu 10
假设您的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)
])
Run Code Online (Sandbox Code Playgroud)
所以它看起来像这样:
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
Run Code Online (Sandbox Code Playgroud)
然后首先向前填充前两行中的NaN(例如,传播'Auto loan').
df.iloc[0:2] = df.iloc[0:2].fillna(method='ffill', axis=1)
Run Code Online (Sandbox Code Playgroud)
接下来用空字符串填充剩余的NaN:
df.iloc[0:2] = df.iloc[0:2].fillna('')
Run Code Online (Sandbox Code Playgroud)
现在将两行连接在一起,.并将其指定为列级别值:
df.columns = df.iloc[0:2].apply(lambda x: '.'.join([y for y in x if y]), axis=0)
Run Code Online (Sandbox Code Playgroud)
最后,删除前两行:
df = df.iloc[2:]
Run Code Online (Sandbox Code Playgroud)
这产生了
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
Run Code Online (Sandbox Code Playgroud)
或者,您可以创建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:]
Run Code Online (Sandbox Code Playgroud)
现在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
Run Code Online (Sandbox Code Playgroud)
该列是MultiIndex:
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]])
Run Code Online (Sandbox Code Playgroud)
该列有两个级别.第一级有值[u'Area', u'Auto loan'],第二级有值[u'Branch Code', u'Branch Name', u'No of accounts', u'Portfolio Outstanding', u'Region'].
然后,您可以通过指定两个级别的值来访问列:
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
Run Code Online (Sandbox Code Playgroud)
使用MultiIndex的一个优点是您可以轻松选择具有特定级别值的所有列.例如,要选择与Auto loans您有关的子DataFrame,可以使用:
In [279]: df.loc[:, 'Auto loan']
Out[279]:
No of accounts Portfolio Outstanding
2 0 0
3 0 0
Run Code Online (Sandbox Code Playgroud)
有关从MultiIndex中选择行和列的更多信息,请参阅使用切片器进行多索引.
| 归档时间: |
|
| 查看次数: |
5024 次 |
| 最近记录: |