Skip to main content
 首页 » 编程设计

python之使用 .loc 的 Series 之间的值分配,具有不同索引的相同大小

2025年05月04日20mfrbuaa

我有一个问题,我有两个大小相同但索引不同的系列。我想将一个系列设置为与另一个系列相等。这可以通过重置索引来完成,但在本例中,我使用 .loc 将 DataFrame 切片为 Series。

设置

假设我有一个数据框:

df = pd.DataFrame({'name': ['a', 'b', 'a', 'b'], \ 
               'num':  [1, 1, 2, 2], \ 
               'val':  None}) 
 
  name  num   val 
0    a    1  None 
1    b    1  None 
2    a    2  None 
3    b    2  None 

还有两个具有值的系列:

vals_a = pd.Series([21,32]) 
vals_b = pd.Series([43,54]) 

期望的结果

  name  num   val  vals 
0    a    1  None  21.0 
1    b    1  None  43.0 
2    a    2  None  32.0 
3    b    2  None  54.0 

我的代码

df.loc[df.name == 'a', 'vals'] = vals_a 
df.loc[df.name == 'b', 'vals'] = vals_b 
 
  name  num   val  vals 
0    a    1  None  21.0 
1    b    1  None  54.0 
2    a    2  None   NaN 
3    b    2  None   NaN 

这是我的问题的简化版本。实际上,vals_a 和 vals_b 是具有可变索引的单独 DataFrame 的切片。我如何对其进行切片以便我的原始 DataFrame 将值存储在较小的系列中?

请您参考如下方法:

pandas 是 index 敏感的,这意味着当你 assign 时,除了你在 loc 中提到的条件, 它仍然会检查 index 是否匹配

df.loc[df.name == 'a', 'vals'] = vals_a.values 
df.loc[df.name == 'b', 'vals'] = vals_b.values 
df 
Out[964]:  
  name  num   val  vals 
0    a    1  None  21.0 
1    b    1  None  43.0 
2    a    2  None  32.0 
3    b    2  None  54.0