python - 在 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)
解决方案
实际上,你需要做pivot
,而不是transpose
。
试试:df.pivot(index='Hierarchy', columns='Fiscal_Mo', values='Amount').fillna('')
。
最终fillna('')
需要替换NaN
和 的不存在组合的值Fiscal_Mo
,Hierarchy
例如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
如你看到的:
- DataFrame 中的列名是连续的数字(错误)。
- 源文件中的列名(Fiscal_Mo、Hierarchy、Amount)是第一行的值(错误)。
在这里,任何调用任何 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
如你看到的:
- DataFrame 中的列名取自第 0 行(OK)。
- 数据行取自“更多”行(确定)。
现在您可以调用例如:
df.pivot(index='Hierarchy', columns='Fiscal_Mo', values='Amount').fillna('')
没有任何错误。
注意:
- 参数值必须完全匹配各自的列名(小写/大写字母)。
- 我叫
df.pivot(...)
不pd.pivot(df, ...)
。显然您没有仔细阅读我的说明并将所有参数复制到您的代码中。
结论:header=None
从read_excel
通话中删除,您的程序应该可以工作。