+------------+-------------+-----------------------+------------------+-------------------+---------------+------------------------------+--------+
| Technology | All Backlog | All Backlog Completed | Percent Complete | Backlog Remaining | Internal ONLY | Ext/Int & Ready For External | Non-IC |
+------------+-------------+-----------------------+------------------+-------------------+---------------+------------------------------+--------+
| Tech 1 | 2395 | 1069 | 44.63% | 1326 | 34 | 219 | 822 |
+------------+-------------+-----------------------+------------------+-------------------+---------------+------------------------------+--------+
假设此表是一个DataFrame ...(索引已删除)
右4列为INT。我希望它们也能像其他列中显示%的列一样显示已完成的%。例如...
+------------+-------------+-----------------------+------------------+-------------------+---------------+------------------------------+--------------+
| Technology | All Backlog | All Backlog Completed | Percent Complete | Backlog Remaining | Internal ONLY | Ext/Int & Ready For External | Non-IC |
+------------+-------------+-----------------------+------------------+-------------------+---------------+------------------------------+--------------+
| Tech 1 | 2395 | 1069 | 44.63% | 1326 | 34 (3.18%) | 219 (20.48%) | 822 (76.89%) |
+------------+-------------+-----------------------+------------------+-------------------+---------------+------------------------------+--------------+
我看过地图,applymap和其他地图……但是我唯一能得到的就是:
+------------+-------------+-----------------------+------------------+-------------------+--------------------------------------+-----------------------------------------+----------------------------------------+
| Technology | All Backlog | All Backlog Completed | Percent Complete | Backlog Remaining | Internal ONLY | Ext/Int & Ready For External | Non-IC |
+------------+-------------+-----------------------+------------------+-------------------+--------------------------------------+-----------------------------------------+----------------------------------------+
| Tech 1 | 2395 | 1069 | 44.63% | 1326 | 34 (0 3.18% 1 3.18% dtype: float64%) | 219 (0 20.49% 1 20.49% dtype: float64%) | 822(0 76.89% 1 76.89% dtype: float64%) |
+------------+-------------+-----------------------+------------------+-------------------+--------------------------------------+-----------------------------------------+----------------------------------------+
我认识到它表现得很奇怪,因为它试图将Series而不是各个数据附加到单元格中。因此,我为什么要映射,但找不到任何东西似乎符合需求。 / p>
这是我目前正在使用的代码。
def get_IC_percomp(df:pd.DataFrame):
"""
This function takes in the DF of the default view's data.
Takes the last 3 columns and divides by items completed.
(Checking for 0 to avoid math issues.) --- might not be possible since comparing DF columns
Columns to perform this on:
Internal ONLY
Ext/Int & Ready For External
Non-IC
Returns a dictionary like: {'Column Name': data_value, ...}
"""
logger.debug('Starting get_IC_percomp()...')
column_list = ['Internal ONLY', 'Ext/Int & Ready For External', 'Non-IC']
new_dict = {column: None for column in column_list} # could also do: dict.fromkeys(keys, None)
for col in column_list:
#if float(df['All Backlog Completed'].applymap(float)) == 0.0:
# new_dict[col] = 0
#else:
# new_dict[col] = df[col] / df['All Backlog Completed']
new_dict[col] = df[col] / df['All Backlog Completed'] * 100
logger.debug('Ending get_IC_percomp()...')
return new_dict
def chg_font_fmt(data_dict:dict):
"""
This function takes in a dictionary of data and returns
a dictionary for use in formatting the DataFrame.
"""
new_dict = dict()
new_dict['Percent Complete'] = '{:.2f}%'
new_dict['Total Percent Complete'] = '{:.2f}%'
new_dict['Historical Percent Complete'] = '{:.2f}%'
new_dict['Sustain Percent Complete'] = '{:.2f}%'
if data_dict is not None:
new_dict['Internal ONLY'] = '{:}' + ' ({}%)'.format(data_dict['Internal ONLY'])
new_dict['Ext/Int & Ready For External'] = '{:}' + ' ({}%)'.format(data_dict['Ext/Int & Ready For External'])
new_dict['Non-IC'] = '{:}' + '({}%)'.format(data_dict['Non-IC'])
return new_dict
percent_dict = None
if view_str.lower() == 'default': # default view
percent_dict = get_IC_percomp(df)
df.format(chg_font_fmt(percent_dict)).set_properties(**{'text-align': 'center'}).render()
可能在这里找到了答案:stackoverflow.com/a/54026256/10474024 但是测试并没有取得成功。
答案 0 :(得分:0)
需要添加新功能 map_perc -请参见下面的代码。
def get_IC_percomp(df:pd.DataFrame):
"""
This function takes in the DF of the default view's data.
Takes the last 3 columns and divides by items completed.
(Checking for 0 to avoid math issues.) --- might not be possible since comparing DF columns
Columns to perform this on:
Internal ONLY
Ext/Int & Ready For External
Non-IC
Returns a dictionary like: {'Column Name': data_value, ...}
"""
logger.debug('Starting get_IC_percomp()...')
column_list = ['Internal ONLY', 'Ext/Int & Ready For External', 'Non-IC']
new_dict = {column: None for column in column_list} # could also do: dict.fromkeys(keys, None)
for col in column_list:
new_dict[col] = df[col] / df['All Backlog Completed'] * 100
logger.debug('Ending get_IC_percomp()...')
return new_dict
def chg_font_fmt(data_dict:dict):
"""
This function takes in a dictionary of data and returns
a dictionary for use in formatting the DataFrame.
"""
new_dict = dict()
new_dict['Percent Complete'] = '{:.2f}%'
new_dict['Total Percent Complete'] = '{:.2f}%'
new_dict['Historical Percent Complete'] = '{:.2f}%'
new_dict['Sustain Percent Complete'] = '{:.2f}%'
if data_dict is not None:
new_dict['Internal ONLY'] = '{:}' + ' ({}%)'.format(data_dict['Internal ONLY'])
new_dict['Ext/Int & Ready For External'] = '{:}' + ' ({}%)'.format(data_dict['Ext/Int & Ready For External'])
new_dict['Non-IC'] = '{:}' + '({}%)'.format(data_dict['Non-IC'])
return new_dict
def map_perc(df:pd.DataFrame, data_dict:dict):
"""
This function takes in a df and dictionary.
Returns DF.
"""
def use_idx_val(row):
"""
https://stackoverflow.com/a/54026256/10474024
"""
idx = row.name
row['Internal ONLY'] = '{} ({:.2f}%)'.format(row['Internal ONLY'], data_dict['Internal ONLY'][idx])
row['Ext/Int & Ready For External'] = '{} ({:.2f}%)'.format(row['Ext/Int & Ready For External'], data_dict['Ext/Int & Ready For External'][idx])
row['Non-IC'] = '{} ({:.2f}%)'.format(row['Non-IC'], data_dict['Non-IC'][idx])
return row
df = df.apply(use_idx_val, axis=1)
return df
percent_dict = None
if view_str.lower() == 'default': # default view
percent_dict = get_IC_percomp(df)
df = map_perc(df, percent_dict)
df.format(chg_font_fmt(percent_dict)).set_properties(**{'text-align': 'center'}).render()