Python中的数据转置
我想使用python::原样将数据转置到一张表中,如下所示 将来 当我尝试使用下面的代码时,它给出了如下输出Python中的数据转置,python,pandas,numpy,Python,Pandas,Numpy,我想使用python::原样将数据转置到一张表中,如下所示 将来 当我尝试使用下面的代码时,它给出了如下输出 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()
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)
实际上,你需要做的是
透视
,而不是转置
试试:df.pivot(index='Hierarchy',columns='Fiscal'u Mo',values='Amount')。fillna('')
对于不存在的值,需要使用最后的fillna(“”)
替换NaN
值
Fiscal\u 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('')
关于您的评论的备注:它包含用
小写h
。也许这就是你问题的根源
编辑
可能层次结构
是数据帧的索引
在这种情况下,pivot
表的索引将仅从
源数据帧的索引,因此应省略index
参数
创建数据帧的相应代码为:
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)
创建透视表的命令是:
df.pivot(columns='Fiscal_Mo', values='Amount').fillna('')
编辑2
关于标题=无的调查
第一次尝试:我执行了:
df = pd.read_excel('Report.xlsx', sheet_name='Report', header=None)
df = pd.read_excel('Report.xlsx', sheet_name='Report')
并打印了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
Fiscal_Mo Hierarchy Amount
0 201801 A 100
1 201802 B 20
2 201803 C 300
3 201801 B 400
如你所见:
数据框中的列名是连续数字(错误)
源文件中的列名(财务报表、层次结构、金额)
是第一行的值(错误)
这里,任何调用任何函数并传递“文本”的尝试
列名将失败
第二次尝试:我执行:
df = pd.read_excel('Report.xlsx', sheet_name='Report', header=None)
df = pd.read_excel('Report.xlsx', sheet_name='Report')
请注意,这次没有标题
参数,因此函数
假设标题=0
-从第0行读取列名(首字母)
当我打印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
Fiscal_Mo Hierarchy Amount
0 201801 A 100
1 201802 B 20
2 201803 C 300
3 201801 B 400
如你所见:
数据帧中的列名取自第0行(确定)
数据行取自“其他”行(确定)
现在您可以拨打电话,例如:
df.pivot(index='Hierarchy', columns='Fiscal_Mo', values='Amount').fillna('')
没有任何错误
请注意:
参数值必须与相应的列名完全匹配
(小写/大写字母)
我调用了df.pivot(…)
notpd.pivot(df…)
。显然你失败了
仔细阅读我的说明并将所有参数复制到代码中
结论:从read_excel
调用中删除header=None
程序应该可以运行。谢谢Valdi的回答,但我在尝试使用代码返回self时遇到了以下错误。_engine.get_loc(self._可能是_cast_indexer(key))文件pandas中的第140行pandas\libs\index.pyx。_libs.index.IndexEngine.get_loc文件pandas\libs\index.pyx,第164行,在pandas._libs.index.IndexEngine.get_loc KeyError:“hierarchy”我也尝试使用小写字母“h”,我尝试读取excel文件,并尝试使用--df=pd.read_excel('Report_test1_111818_15_32_27.xlsx',sheet_name=“test header=None)透视表中的数据d=pd.pivot_table(df,index=[“hierarchy”])注意,在示例代码中,我编写了index='hierarchy'(不带方括号),还有columns='Fiscal_No'。显然第一行只包含列名。为什么要写header=None?在这种情况下,第一行(列名)实际上是第一个数据行,列名是连续的数字。我想,这不是你想要的。要查看此详细信息,请在代码中添加打印(df)。谢谢Valdi。。场景2运行得很好。。但我对如何在as列和values列保持不变的情况下动态更改索引有疑问