python - 熊猫如何阅读子标题
问题描述
我正在使用 python+pandas 来处理一个 csv 文件。
csv 文件有多个标题,例如
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 绘制所有内容。)
解决方案
使用 parameter header=[0,1]
,但接下来的处理是必要的 - 将Unnamed
列替换为NaN
然后通过前向填充:
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
推荐阅读
- java - Spring Data JPA 的奇怪行为
- html - CSS子级在缩放时无法正确呈现
- java - 如何在同一活动中为底部导航和导航抽屉创建侦听器?
- c++ - 将浮点数转换为无符号字符数组并打印
- apache-spark - 使用 PySpark 将 Kafka Stream 转换为 Spark Stream
- vb.net - 制作表单中所有文本框值的列表
- bash - BASH:更改一行中的单个变量
- python - tf.contrib.nn.sampled_sparse_softmax_loss 是否允许进行 float16 训练?
- java - org.openqa.selenium.ElementNotVisibleException:通过 SeleniumWebDriver 和 Java 单击复选框时元素当前不可见
- mysql - 如何从 R 中的 MySQL 读取多个表