python - Pandas 读取带空白的多索引 csv

标签 python python-2.7 csv pandas

我正在努力正确加载具有多行标题和空白的 csv。 CSV 看起来像这样:

,,C,,,D,,
A,B,X,Y,Z,X,Y,Z
1,2,3,4,5,6,7,8

CSV Header

我想得到的是:

Desired Pandas Header

当我尝试使用 pd.read_csv(file, header=[0,1], sep=',') 加载时,我得到以下结果:

Incorrect result

有没有办法得到想要的结果?


注意:或者,我会接受这样的结果:

Alternative result


使用的版本:

  • python :2.7.8
  • Pandas 0.16.0

最佳答案

这是一种自动修复列索引的方法。第一的, 将列级值拉入 DataFrame:

columns = pd.DataFrame(df.columns.tolist())

然后将 Unnamed: 列重命名为 NaN:

columns.loc[columns[0].str.startswith('Unnamed:'), 0] = np.nan

然后前向填充 NaN:

columns[0] = columns[0].fillna(method='ffill')

这样现在看起来像

In [314]: columns
Out[314]: 
     0  1
0  NaN  A
1  NaN  B
2    C  X
3    C  Y
4    C  Z
5    D  X
6    D  Y
7    D  Z

现在我们可以找到剩余的 NaN 并用空字符串填充它们:

mask = pd.isnull(columns[0])
columns[0] = columns[0].fillna('')

要使前两列 AB 可索引为 df['A']df[' B']——就好像它们是单层的——你可以交换第一列和第二列中的值:

columns.loc[mask, [0,1]] = columns.loc[mask, [1,0]].values

现在您可以构建一个新的 MultiIndex 并将其分配给 df.columns:

df.columns = pd.MultiIndex.from_tuples(columns.to_records(index=False).tolist())

把它们放在一起,如果data

,,C,,,D,,
A,B,X,Y,Z,X,Y,Z
1,2,3,4,5,6,7,8
3,4,5,6,7,8,9,0

然后

import numpy as np
import pandas as pd
df = pd.read_csv('data', header=[0,1], sep=',')
columns = pd.DataFrame(df.columns.tolist())
columns.loc[columns[0].str.startswith('Unnamed:'), 0] = np.nan
columns[0] = columns[0].fillna(method='ffill')
mask = pd.isnull(columns[0])
columns[0] = columns[0].fillna('')
columns.loc[mask, [0,1]] = columns.loc[mask, [1,0]].values
df.columns = pd.MultiIndex.from_tuples(columns.to_records(index=False).tolist())
    print(df)

产量

   A  B  C        D      
         X  Y  Z  X  Y  Z
0  1  2  3  4  5  6  7  8
1  3  4  5  6  7  8  9  0

关于python - Pandas 读取带空白的多索引 csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30322581/

相关文章:

python - 获取可迭代列表组合的优雅方法

python - QHBoxLayout(QWidget) : argument 1 has unexpected type 'QVBoxLayout'

python - 循环遍历日期字符串列表 : strptime outputs "Datetime.date(2011-7-5)" instead of (2011-7-5)

python - 根据python中的条件索引添加子列表元素

php - 使用 PHP 查询 mysql,放置空字段,并将数据导出为 CSV

python - 如何在 Django 中添加印度标准时间 (IST)?

python - 解析存储在 pandas 数据框列中的推文

Python:打开大型文本文件,但仅加载包含预定义列值的行

ruby - 使用 Ruby 从 CSV 解析数据?

scala - 当最后一列名称包含空格时,Spark 无法读取 CSV