【发布时间】:2020-11-28 08:38:24
【问题描述】:
我希望能够获取 Pandas 数据透视表中的列数和每列的宽度。这是我的代码:
import pandas as pd
import numpy as np
df = pd.DataFrame({'System_Key':['MER-002', 'MER-003', 'MER-004', 'MER-005', 'MER-006', 'MER-007', 'BAV-378', 'BAV-379', 'BAV-380', 'BAV-381', 'AUD-220', 'AUD-221', 'AUD-222', 'AUD-223'],
'Manufacturer':['Mercedes', 'Mercedes', 'Mercedes', 'Mercedes', 'Mercedes', 'Mercedes', 'BMW', 'BMW', 'BMW', 'BMW', 'Audi', 'Audi', 'Audi', 'Audi'],
'Region':['Americas', 'Europe', 'Americas', 'Asia', 'Asia', 'Europe', 'Europe', 'Asia', 'Europe', 'Europe', 'Americas', 'Asia', 'Americas', 'Americas'],
'Department':[np.nan, 'Sales', np.nan, 'Operations', np.nan, np.nan, 'Accounting', 'Finance', 'Finance', np.nan, 'Finance', 'Finance', 'Finance', np.nan],
'Approver':[np.nan, 'Jones, T.', 'Smith, W.', 'Jones, T.', 'Jones, T.', np.nan, np.nan, np.nan, 'Balakrishnan, G.', np.nan, np.nan, np.nan, np.nan, np.nan]
})
df = df.applymap(str)
df['Rebate_Plan'] = np.where(df['System_Key'].str.contains('BAV', na=False), 'Jupyter',
np.where(df['System_Key'].str.contains('AUD', na=False), 'Uranus',
np.where((df['System_Key'].str.contains('MER', na=False)) & (df['Approver'].str.contains('Jones', na=False)), 'Saturn',
np.where((df['System_Key'].str.contains('MER')) & (~df['Approver'].str.contains('Jones')), 'Pluto', '*No Plan*'))))
df.replace(['None', 'nan'], np.nan, inplace=True)
pivot_data = pd.pivot_table(data=df, index='Manufacturer', columns='Approver', values='System_Key', aggfunc='count', margins=True, margins_name='TOTALS', fill_value=0)
结果如下
print('-' * 60)
print(pivot_data)
print('-' * 60)
----------------------------------------------------------------------
Approver Balakrishnan, G. Jones, T. Smith, W. TOTALS
Manufacturer
BMW 1 0 0 1
Mercedes 0 3 1 4
TOTALS 1 3 1 5
----------------------------------------------------------------------
在此示例中,请注意数据透视表上方和下方的连字符 ('-') 换行符终止于“TOTALS”的最后一个字符。
我希望能够获得列的数量和宽度,以便可以在数据透视表的上方和下方打印可变长度换行符在控制台中。
如果我们不考虑列宽,那么列数的伪代码如下所示:
if number_of_pivot_table_columns == 2:
print('-' * 45)
print(pivot_data)
print('-' * 45)
elif number_of_pivot_table_columns == 3:
print('-' * 60)
print(pivot_data)
print('-' * 60)
elif number_of_pivot_table_columns == 4:
print('-' * 75)
print(pivot_data)
print('-' * 75)
(当然,这种方法仅适用于列宽为 15 个字符的情况,这在实践中不会发生,因为人的首字母和姓氏可以是任意数量的字符。)
提前感谢您的帮助!
【问题讨论】:
-
首先,len(pivot_data.columns) 提供列数加上索引列。
-
其次,您可能需要考虑 pivot_data.transpose() 因为列取决于最长名称的 max len。由于“制造商”是受控的???