首页 > 解决方案 > Pandas:如何在多级列选择和值设置中解释这种 .loc 行为

问题描述

我正在尝试使用.loc为多级列数据框的某些单元格选择和设置值。但是我对我得到的结果和错误感到困惑。

例如,

my_list = [['Chicago', 'A', 112, 8],
      ['Philly', 'A', 252, 19],
      ['LA', 'A', 411, 12], 
      ['Chicago', 'B', 112, 8],
      ['Philly', 'B', 252, 19],
      ['LA', 'B', 411, 12]]
df1 = pd.DataFrame(columns=['City', 'Firm', 'Employee', 'Revenue'], 
                    data=my_list)
df1 = df1.set_index(['City', 'Firm']).unstack()
df1

这会给我一个看起来像这样的数据框:

p1

在这里,我试图为两个带圆圈的单元格选择和设置值:

圆圈

我很困惑是否使用df1.loc['LA', 'Revenue']df1.loc['LA', ['Revenue']]。前者给了我结果

Firm
A    12
B    12
Name: LA, dtype: int64

与后者相比,产生

         Firm
Revenue  A       12
         B       12
Name: LA, dtype: int64

任何一种方法都可以让我设置值。但是如果我按第二级对列顺序进行排序,就会出现错误。

df2 = df1.sort_index(1, 1)
df2

现在数据框如下所示:

新的df

然后,如果我想用df2.loc['LA', 'Revenue']它设置值将不起作用。

df2.loc['LA', 'Revenue'] = 5

我收到错误“TypeError:只有整数标量数组可以转换为标量索引”,而另一种方法工作正常。

df2.loc['LA', ['Revenue']] = 2000
df2

放

所以我真的很好奇在选择多级索引/列时.loc中括号的功能以及为什么对多级列的级别进行排序会导致值设置失败。

作为记录,我在处理原始数据时遇到了另一个错误:

dfn

工作

dfn.loc['NOK', 'order'] = 5

这给了我“ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()”

标签: pythonpandasdataframe

解决方案


 la A B for Revenue was 12 12. unstack remove the multiple key index.  set_index to city and firm, use loc to replace your  value, then unstack the dataframe for display 


 my_list = [['Chicago', 'A', 112, 8],
  ['Philly', 'A', 252, 19],
  ['LA', 'A', 411, 12], 
  ['Chicago', 'B', 112, 8],
  ['Philly', 'B', 252, 19],
  ['LA', 'B', 411, 12]]
 
 df1 = pd.DataFrame(columns=['City', 'Firm', 'Employee', 'Revenue'], 
                data=my_list)
 df1 = df1.set_index(['City', 'Firm'])

 df1.loc[('LA','B'),'Revenue']=14
 df1.loc[('LA','A'),'Revenue']=13

  df1 = df1.unstack()
  print(df1)

  output
     Employee      Revenue    
   Firm           A    B       A   B
   City                             
   Chicago      112  112       8   8
   LA           411  411      13  14
   Philly       252  252      19  19

推荐阅读