【问题标题】:Creating a new column based on the key of a dictionary?根据字典的键创建新列?
【发布时间】:2020-04-22 21:25:02
【问题描述】:

我正在尝试在使用字符串文字和键的字典项的 for 循环内的数据框中创建一个新列,但它会引发“ValueError:无法设置没有定义索引和标量的框架”错误信息。

exp 类别的字典定义

  d = {'Travel & Entertainment': [1,2,3,4,5,6,7,8,9,10,11], 'Office supplies & Expenses': [13,14,15,16,17],
    'Professional Fees':[19,20,21,22,23], 'Fees & Assessments':[25,26,27], 'IT Expenses':[29],
    'Bad Debt Expense':[31],'Miscellaneous expenses': [33,34,35,36,37],'Marketing Expenses':[40,41,42],
    'Payroll & Related Expenses': [45,46,47,48,49,50,51,52,53,54,55,56], 'Total Utilities':[59,60],
    'Total Equipment Maint, & Rental Expense': [63,64,65,66,67,68],'Total Mill Expense':[70,71,72,73,74,75,76,77],
    'Total Taxes':[80,81],'Total Insurance Expense':[83,84,85],'Incentive Compensation':[88],
    'Strategic Initiative':[89]}

基于主数据框创建新数据框

mcon = VA.loc[:,['Expense', 'Mgrl', 'Exp Category', 'Parent Category']]
mcon.loc[:,'Variance Type'] = ['Unfavorable' if x < 0 else 'favorable' for x in mcon['Mgrl']]
mcon.loc[:,'Business Unit'] = 'Managerial Consolidation'
mcon = mcon[['Business Unit', 'Exp Category','Parent Category', 'Expense', 'Mgrl', 'Variance Type']]
mcon.rename(columns={'Mgrl':'Variance'}, inplace=True)

创建一个最终将写入 excel 的新数据框

a1 = pd.DataFrame() 
for key, value in d.items():
    umconm = mcon.iloc[value].query('Variance < 0').nsmallest(5, 'Variance')
    fmconm = mcon.iloc[value].query('Variance > 0').nlargest(5, 'Variance')
    if umconm.empty == False or fmconm.empty == False:
        a1 = pd.concat([a1,umconm,fmconm], ignore_index = True)
    else:
        continue
a1.to_csv('example.csv', index = False)

输出如下所示

我正在尝试添加一个新列,显示比 {key} 更高/更低的预算,其中 key 代表使用以下代码的费用类型

for key, value in d.items():
    umconm = mcon.iloc[value].query('Variance < 0').nsmallest(5, 'Variance')
    umconm.loc[:,'Explanation'] = f'Lower than budgeted {key}'
    fmconm = mcon.iloc[value].query('Variance > 0').nlargest(5, 'Variance')
    fmconm.loc[:,'Explanation'] = f'Higher than budgeted {key}'
    if umconm.empty == False or fmconm.empty == False:
        a1 = pd.concat([a1,umconm,fmconm], ignore_index = True)
    else:
        continue

但是使用上面的字符串文字给了我错误信息“ValueError: cannot set a frame with no defined index and a scalar”

非常感谢任何帮助来纠正此问题或找到将此字段添加到我的数据框的其他解决方案。提前致谢!

【问题讨论】:

    标签: python pandas string-literals data-wrangling


    【解决方案1】:

    出现这个错误是因为这一行

    umconm = mcon.iloc[value].query('Variance < 0').nsmallest(5, 'Variance')
    

    有时会产生没有索引的空数据框。当您想设置列(而不是 loc)时,请改用此方法:

    a['Explanation'] = f'Lower than budgeted {key}'
    

    【讨论】:

    • 感谢您的回复!这是有道理的,我只是尝试不使用 .loc 并且它有效,但不知道为什么它对另一个有效,但现在它是有道理的。谢谢!
    【解决方案2】:

    我太傻了,解决方法如下:

    for key, value in d.items():
        umconm = mcon.iloc[value].query('Variance < 0').nsmallest(5, 'Variance')
        umconm['Explanation'] = f'Higher than Budget for {key}'
        fmconm = mcon.iloc[value].query('Variance > 0').nlargest(5, 'Variance')
        fmconm['Explanation'] = f'Lower than Budget for {key}'
        if umconm.empty == False or fmconm.empty == False:
            a1 = pd.concat([a1,umconm,fmconm], ignore_index = True)
        else:
            continue
    

    在此数据框中创建新列时,我不必使用 .loc!

    【讨论】:

      猜你喜欢
      • 2019-02-23
      • 2022-11-15
      • 1970-01-01
      • 2017-04-10
      • 2023-03-25
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多