Python 如何在数据框中为新创建的列修改多个行范围?

Python 如何在数据框中为新创建的列修改多个行范围?,python,pandas,data-wrangling,Python,Pandas,Data Wrangling,我在尝试为数据帧中新创建的列修改多个行范围的值时遇到了问题,希望得到一些帮助。如果以前有人问过这个问题,我深表歉意,如果您能为我指出正确的方向,我将不胜感激。我是python编码的新手 因此,我从损益表中为多家公司导入了一系列数据,这些公司合并为一个整体;并在进行上述修改以进行进一步分析之前对其进行清洁: import pandas as pd from tabulate import tabulate dftabulate = lambda df:tabulate(df,headers='k

我在尝试为数据帧中新创建的列修改多个行范围的值时遇到了问题,希望得到一些帮助。如果以前有人问过这个问题,我深表歉意,如果您能为我指出正确的方向,我将不胜感激。我是python编码的新手

因此,我从损益表中为多家公司导入了一系列数据,这些公司合并为一个整体;并在进行上述修改以进行进一步分析之前对其进行清洁:

import pandas as pd
from tabulate import tabulate

dftabulate = lambda df:tabulate(df,headers='keys',tablefmt='psql')
CleanCols = [5,7,8,9,10,11,12,13,14,15,17]
SummaryRows = [0,39,44,58,62,79,87]

VA = pd.read_excel('Columnar BU P&L.xlsx', sheet_name = 'Variance by Co')
VA = VA[98:197]
VA = VA.iloc[:,CleanCols]
VA.columns =  ['Expense','A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'All Companies']
VA = VA.dropna(axis = 0, how = 'any')
VA = VA.reset_index(drop = True)
VAtcols = VA.columns.drop('Expense')
VA[VAtcols] = VA[VAtcols].astype(int)
VM = VA.iloc[SummaryRows]
VA['Exp Category'] = 'NA'
print(dftabulate(VA.head()))
输出如下所示:

                                    Expense      A  ...  All Companies  Exp Category
0  General and Administrative Expenses (G&A) -4550  ...         133886            NA
1                             Communications   -17  ...          -4793            NA
2                              Fuel - Travel     0  ...          -1274            NA
3                             Mileage & Auto   449  ...           -251            NA
4                                     Travel     0  ...           1187            NA
我试图实现的是根据行索引将新创建的Exp Category列更改为多个值。例如,我想将第1:12行更改为Travel&Entertainment等。当我使用下面的代码创建此分类时,它不会抛出错误,但不会更改为此列指定的NA值,我似乎无法找出我在这里做错了什么

VA[1:12]['Exp Category'] = 'Travel & Entertainment'
VA[13:18]['Exp Category'] = 'Office Supplies & Expenses'
VA[19:24]['Exp Category'] = 'Professional Fees'
VA[25:28]['Exp Category'] = 'Fees & Assessments'
VA[29:30]['Exp Category'] = 'IT Expense'
VA[31:32]['Exp Category'] = 'Bad Debt Expense'
VA[33:38]['Exp Category'] = 'Misc Expense'
VA[40:43]['Exp Category'] = 'Marketing Expenses'
VA[45:57]['Exp Category'] = 'Payroll & Related Expenses'
VA[59:61]['Exp Category'] = 'Utilities Expenses'
VA[63:69]['Exp Category'] = 'Equip Maint & Rental Expenses'
VA[70:78]['Exp Category'] = 'Mill Expenses'
VA[80:82]['Exp Category'] = 'Taxes'
VA[83:86]['Exp Category'] = 'Insurance'
VA[88:89]['Exp Category'] = 'Incentive Compensation'
VA[89:90]['Exp Category'] = 'Strategic Initiative'
输出仍然是这样的,带有关于返回-a-view-verus-a-copy的警告消息:

                                    Expense      A  ...  All Companies  Exp Category
0  General and Administrative Expenses (G&A) -4550  ...         133886            NA
1                             Communications   -17  ...          -4793            NA
2                              Fuel - Travel     0  ...          -1274            NA
3                             Mileage & Auto   449  ...           -251            NA
4                                     Travel     0  ...           1187            NA
我试图查看“SettingWithCopyWarning”消息,但尽管阅读了该材料,我不知道如何修复它,如果有任何反馈,我将不胜感激


提前谢谢

使用pd.loc可能实现您想要的:

示例数据帧

import pandas as pd
d = {'a': [1, 2, 3, 4],
     'b': ['NA', 'NA', 'NA', 'NA']}
df = pd.DataFrame(data = d)
df

    a   b
0   1   NA
1   2   NA
2   3   NA
3   4   NA
df.loc[0:2, 'b'] = 'Test'
df

    a   b
0   1   Test
1   2   Test
2   3   Test
3   4   NA
将pd.loc应用于数据帧

import pandas as pd
d = {'a': [1, 2, 3, 4],
     'b': ['NA', 'NA', 'NA', 'NA']}
df = pd.DataFrame(data = d)
df

    a   b
0   1   NA
1   2   NA
2   3   NA
3   4   NA
df.loc[0:2, 'b'] = 'Test'
df

    a   b
0   1   Test
1   2   Test
2   3   Test
3   4   NA
数据示例

# Python indexing starts at 0, so row 1 = position 0
VA.loc[0:11, 'Exp Category'] = 'Travel & Entertainment'

希望这有帮助

VA['Exp Category']=['Travel&Entertainment']*12+['Office Supplies&Expenses']*6+…
有关更多信息,请参阅。非常感谢!我确实有点难以实现,因为它是为很多行,但我确实理解背后的逻辑!谢谢你的帮助