2

我已经搜索了一段时间,但仍然无法弄清楚。如果您能给我一些帮助,我将不胜感激。

我有一个excel文件:

      ,   John,    James,    Joan,
      ,   Smith,   Smith,    Smith,
Index1,   234,     432,      324,
Index2,   2987,    234,      4354,

我想把它读入一个数据框,这样“约翰史密斯,詹姆斯史密斯,琼史密斯”是我的标题。我试过以下方法,但我的标题仍然是“约翰,詹姆斯,琼”

xl = pd.ExcelFile(myfile, header=None)
row = df.apply(lambda x: str(x.iloc[0]) + str(x.iloc[1]))
df.append(row,ignore_index=True)

nrow = df.shape[0]
df = pd.concat([df.ix[nrow:], df.ix[2:nrow-1]])
4

3 回答 3

1

May be it's easier to do by hand?:

>>> import itertools

>>> xl = pd.ExcelFile(myfile, header=None)
>>> sh = xl.book.sheet_by_index(0)
>>> rows = (sh.row_values(i) for i in xrange(sh.nrows))
>>> hd = zip(*itertools.islice(rows, 2))[1:]   # read first two rows
>>> df = pd.DataFrame(rows)                    # create DataFrame from remaining rows
>>> df = df.set_index(0)
>>> df.columns = [' '.join(x) for x in hd]     # rename columns
>>> df
        John Smith  James Smith  Joan Smith
0                                          
Index1         234          432         324
Index2        2987          234        4354
于 2013-11-01T17:00:16.707 回答
1

如果需要,您可以将两个级别分开。例如,如果您想仅根据姓氏过滤列,这可能会很有用。否则,其他解决方案肯定比这看起来更好。

通常这对我有用:

In [103]: txt = '''John,James,Joan
     ...: Smith,Smith,Smith
     ...: 234,432,324
     ...: 2987,234,4354
     ...: '''

In [104]: x = pandas.read_csv(StringIO(txt), header=[0,1])
     ...: x.columns = pandas.MultiIndex.from_tuples(x.columns.tolist())
     ...: x
     ...: 

但由于某种原因,这缺少第一行:/

In [105]: x
Out[105]: 
    John  James   Joan
   Smith  Smith  Smith
0   2987    234   4354

我会检查 pandas 邮件列表,看看这是否是一个错误。

于 2013-11-01T17:19:43.477 回答
1

我通过将 Excel 文件转换为 csv 文件和以下内容来解决问题:

df = pd.read_csv(myfile, header=None)    
header = df.apply(lambda x: str(x.ix[0]) + ' ' + str(x.ix[1]))
df = df[2:]
df.columns = header

这是输出:

Out[252]: 
  John Smith  James Smith  Joan Smith
2        234          432         324
3       3453         2342         563

但是,当我通过 pd.ExcelFile 阅读(并解析我感兴趣的特定工作表)时,存在与@Paul H 类似的问题。似乎 Excel 格式默认将第一行视为列名并返回我的东西,例如:

   Smith 234    Smith 432   Smith 324
3       3453         2342         563
于 2013-11-01T23:14:20.753 回答