如何在数据帧df中迭代选定的列

  • 本文关键字:迭代 数据帧 df python pandas
  • 更新时间 :
  • 英文 :


我有一个DataFrame,df,有3775行×8列。

我的df.columns

Index(['FY', 'Month', 'Sales Area', 'BSP Agent', 'City Booking Office','General Sales Agent', 'Web Sales', 'Total'] of dtype='object'

对于列df[['BSP Agent', 'City Booking Office', 'General Sales Agent', 'Web Sales', 'Total']],我想执行以下操作:从列中删除空格,然后将对象转换为数字。

我使用了for loop,但它非常令人困惑

for e in df_c:
df_c[e] = df_c[e].replace(' ', '', regex=True)
df_c[e] = pd.to_numeric(df_c[e], errors='coerce').fillna(0, downcast='infer')
break

有更好的方法来完成我的任务吗?

如果从文件创建DataFrame,并且空格为数千,最好的解决方案是在read_csv中使用thousands参数,那么也可以将正确的列转换为数字:

df = pd.read_csv(file, thousands=' ')

DataFrame.replaceDataFrame.fillna与列表中所有选定的列一起使用,并将其转换为数字使用DataFrame.apply:

cols = ['BSP Agent', 'City Booking Office', 'General Sales Agent', 'Web Sales', 'Total']
df[cols] = (df[cols].replace(' ', '', regex=True)
.apply(lambda x: pd.to_numeric(x, errors = 'coerce'))
.fillna(0, downcast='infer'))

样本

np.random.seed(123)
c =['FY', 'Month', 'Sales Area', 'BSP Agent', 
'City Booking Office','General Sales Agent', 'Web Sales', 'Total']
cols = ['BSP Agent', 'City Booking Office', 'General Sales Agent', 'Web Sales', 'Total']
df = (pd.DataFrame(np.random.rand(5, len(cols)) * 10000, columns=cols)
.astype(int)
.applymap(lambda x: '{:,}'.format(x).replace(',', ' '))
.reindex(c, axis=1, fill_value='data'))
print (df)
FY Month Sales Area BSP Agent City Booking Office General Sales Agent  
0  data  data       data     6 964               2 861               2 268   
1  data  data       data     4 231               9 807               6 848   
2  data  data       data     3 431               7 290               4 385   
3  data  data       data     7 379               1 824               1 754   
4  data  data       data     6 344               8 494               7 244   
Web Sales  Total  
0     5 513  7 194  
1     4 809  3 921  
2       596  3 980  
3     5 315  5 318  
4     6 110  7 224  

cols = ['BSP Agent', 'City Booking Office', 'General Sales Agent', 'Web Sales', 'Total']
df[cols] = (df[cols].replace(' ', '', regex=True)
.apply(lambda x: pd.to_numeric(x, errors = 'coerce'))
.fillna(0, downcast='infer'))
print (df)
FY Month Sales Area  BSP Agent  City Booking Office  General Sales Agent  
0  data  data       data       6964                 2861                 2268   
1  data  data       data       4231                 9807                 6848   
2  data  data       data       3431                 7290                 4385   
3  data  data       data       7379                 1824                 1754   
4  data  data       data       6344                 8494                 7244   
Web Sales  Total  
0       5513   7194  
1       4809   3921  
2        596   3980  
3       5315   5318  
4       6110   7224  

您可以通过执行以下操作来避免for循环:

c = ['FY', 'Month', 'Sales Area', 'BSP Agent', 'City Booking Office',
'General Sales Agent', 'Web Sales', 'Total']
df[c] = df[c].apply(lambda x: x.str.replace(' ',  ''))
df[c]= df[c].apply(pd.to_numeric, errors = 'coerce').fillna(0, downcast='infer')

最新更新