用Python转置数据

时间:2018-11-18 10:48:25

标签: python pandas numpy

我想使用python :: AS IS

将数据转置为一张纸,如下所示

enter image description here

成为

enter image description here

当我尝试使用下面的代码时,它给我的输出如下

import numpy as np
import pandas as pd
import openpyxl
dfs = pd.read_excel('test.xlsx', sheet_name=None,header=None)
tester=dfs['data'].values.tolist()
keys = list(zip(*tester))[0]
seen = set()
seen_add = seen.add
keysu= [x for x in keys if not (x in seen or seen_add(x))]
values = list(zip(*tester))[1]
a = np.array(values).reshape(int(len(values)/len(keysu)),len(keysu))
list1=[keysu]
for i in a:
 list1.append(list(i))
 df=pd.DataFrame(list1)
 df.to_excel('test1.xlsx',index=False,header=False)

enter image description here

1 个答案:

答案 0 :(得分:1)

实际上,您需要执行pivot,而不是transpose

尝试:df.pivot(index='Hierarchy', columns='Fiscal_Mo', values='Amount').fillna('')

需要最后的fillna('')来替换NaN值(不存在) Fiscal_MoHierarchy的组合,例如201802 / A

完整代码:

import pandas as pd

df = pd.DataFrame( {'Fiscal_Mo': ['201801', '201802', '201803', '201801'],
    'Hierarchy': ['A', 'B', 'C', 'B'], 'Amount': [ 100, 20, 300, 400 ] } )
df.pivot(index='Hierarchy', columns='Fiscal_Mo',values='Amount').fillna('')

关于您的评论的评论:其中包含hierarchy 小写 h。也许这是您问题的根源?

编辑

也许Hierarchy是您的DataFrame的索引。

在这种情况下,pivot表的索引只是从 源DataFrame的索引,因此应省略index参数。

创建DataFrame的相应代码为:

import pandas as pd

ind = pd.Index(data=['A', 'B', 'C', 'B'], name='Hierarchy')
df = pd.DataFrame( data={'Fiscal_Mo': ['201801', '201802', '201803', '201801'],
    'Amount': [ 100, 20, 300, 400 ] }, index=ind)

,创建pivot表的命令是:

df.pivot(columns='Fiscal_Mo', values='Amount').fillna('')

编辑2

header=None

有关的调查

第一次尝试:我执行了:

df = pd.read_excel('Report.xlsx', sheet_name='Report', header=None)

并打印df,结果是:

           0          1       2
0  Fiscal_Mo  Hierarchy  Amount
1     201801          A     100
2     201802          B      20
3     201803          C     300
4     201801          B     400

如您所见:

  1. DataFrame中的列名称是连续数字(错误)。
  2. 源文件中的列名( Fiscal_Mo 层次结构金额) 是第一行的值(错误)。

在这里,任何尝试调用任何Pandas函数并传递“文本”的尝试 列名称将失败。

第二次尝试:我执行:

df = pd.read_excel('Report.xlsx', sheet_name='Report')

请注意,这次没有header参数,因此该函数 假设header=0-从第0行(初始)读取列名。

当我打印df时,结果是:

   Fiscal_Mo Hierarchy  Amount
0     201801         A     100
1     201802         B      20
2     201803         C     300
3     201801         B     400

如您所见:

  1. DataFrame中的列名称取自第0行(确定)。
  2. 数据行来自“更多”行(确定)。

现在您可以拨打例如:

df.pivot(index='Hierarchy', columns='Fiscal_Mo', values='Amount').fillna('')

没有任何错误。

请注意:

  1. 参数值必须完全匹配各自的列名 (小写/大写字母)。
  2. 我叫df.pivot(...)而不是pd.pivot(df, ...)。显然你失败了 仔细阅读我的说明并将所有参数复制到您的代码中。

结论:从header=None通话中删除read_excel,您的 程序应该可以工作。