在Python中转置数据

2024-10-02 00:38:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用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


Tags: inimportaddlenasnpexcellist
1条回答
网友
1楼 · 发布于 2024-10-02 00:38:02

实际上,您需要做pivot,而不是{}。在

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

最后的fillna('')是用来替换不存在的NaN值的 Fiscal_Mo和{}的组合,例如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是数据帧的索引。在

在本例中,pivot表的索引是通过 源数据帧的索引,因此index参数应该被省略。在

创建数据帧的相应代码是:

^{pr2}$

创建pivot表的命令是:

^{3}$

编辑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. 源文件中的列名(会计科目层次结构金额) 是第一行的值(错误)。在

在这里,任何调用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. 数据帧中的列名取自行号0(确定)。在
  2. 数据行取自“进一步”行(确定)。在

现在您可以打电话给例如:

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

没有任何错误。在

请注意:

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

结论:从read_excel电话中删除header=None,并 程序应该可以工作。在

相关问题 更多 >

    热门问题