首页 > 解决方案 > 在 Python 中转置数据

问题描述

我想使用 python:: AS IS 将数据转置在一张纸中,如下所示

在此处输入图像描述

成为

在此处输入图像描述

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

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)

在此处输入图像描述

标签: pythonpandasnumpy

解决方案


实际上,你需要做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_MoHierarchyAmount)是第一行的值(错误)。

在这里,任何调用任何 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 行(OK)。
  2. 数据行取自“更多”行(确定)。

现在您可以调用例如:

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

没有任何错误。

注意:

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

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


推荐阅读