我想使用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)
答案 0 :(得分:1)
实际上,您需要执行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('')
与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
如您所见:
在这里,任何尝试调用任何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
如您所见:
现在您可以拨打例如:
df.pivot(index='Hierarchy', columns='Fiscal_Mo', values='Amount').fillna('')
没有任何错误。
请注意:
df.pivot(...)
而不是pd.pivot(df, ...)
。显然你失败了
仔细阅读我的说明并将所有参数复制到您的代码中。结论:从header=None
通话中删除read_excel
,您的
程序应该可以工作。