python - Pandas 如何阅读子标题

标签 python python-3.x pandas csv

我正在使用 python+pandas 来处理一个 csv 文件。

csv文件有多个header,比如

       Header1                     Header2
Date   Subheader1-1 Subheader1-2   Subheader2-1 Subheader2-2

在原始文本格式下,csv 文件内容看起来像

,Header1,,Header2,,...
Date,Subheader1-1,Subheader1-2,Subheader2-1,Subheader2-2,...
...

我的问题是,

Pandas 是否支持这种子标题格式? 如果没有,是否有办法将此 csv 读入 pandas 数据框并对其进行一些计算?

(计算就像提取 Header1 的 Subheader1-2 列,计算平均值和 STD,并使用 matplotlib 绘制所有内容。)

最佳答案

使用参数header=[0,1],但接下来需要进行下一步处理——将Unnamed列替换为NaN,然后通过forward填充:

import pandas as pd

temp=u''',Header1,,Header2,
Date,Subheader1-1,Subheader1-2,Subheader2-1,Subheader2-2
2018-01-02,10,2,5,6'''
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), header=[0,1])
print (df) 
  Unnamed: 0_level_0      Header1 Unnamed: 2_level_0      Header2  \
                Date Subheader1-1       Subheader1-2 Subheader2-1   
0         2018-01-02           10                  2            5   

  Unnamed: 4_level_0  
        Subheader2-2  
0                  6 

a = df.columns.get_level_values(0).to_series()
b = a.mask(a.str.startswith('Unnamed')).ffill().fillna('')
df.columns = [b, df.columns.get_level_values(1)]
print (df)
                   Header1                   Header2             
         Date Subheader1-1 Subheader1-2 Subheader2-1 Subheader2-2
0  2018-01-02           10            2            5            6

另一个更好的解决方案是按第一列创建索引:

import pandas as pd

temp=u''',Header1,,Header2,
Date,Subheader1-1,Subheader1-2,Subheader2-1,Subheader2-2
2018-01-02,10,2,5,6'''
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), header=[0,1], index_col=[0])
print (df) 
                Header1 Unnamed: 2_level_0      Header2 Unnamed: 4_level_0
Date       Subheader1-1       Subheader1-2 Subheader2-1       Subheader2-2
2018-01-02           10                  2            5                  6

a = df.columns.get_level_values(0).to_series()
b = a.mask(a.str.startswith('Unnamed')).ffill().fillna('')
df.columns = [b, df.columns.get_level_values(1)]
print (df)
                Header1                   Header2             
Date       Subheader1-1 Subheader1-2 Subheader2-1 Subheader2-2
2018-01-02           10            2            5            6

关于python - Pandas 如何阅读子标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51871136/

相关文章:

python - 无法导入同一目录中的其他文件

python - 创建一个名称与列表中项目名称相同的变量

python - 用于选择数据的 Pandas 源

python - 如何根据其他列值重命名 pandas DataFrame 索引标签

python - 如何使用TermQuery对多个term进行AND查询?

python:如何中断正则表达式匹配

python - 当我从空闲状态导入 `http.server` 时它可以工作,但是当我运行具有 `import http.server` 的 python 文件时出现错误

python - 如何使用idlelib.PyShell在tkinter程序中嵌入解释器?

python - Python训练数据集

Python 拼写检查器