【问题标题】:Adding two values of two columns and assigning the result to a third column in a pandas multi-index DataFrame将两列的两个值相加并将结果分配给 pandas 多索引 DataFrame 中的第三列
【发布时间】:2020-12-31 15:08:56
【问题描述】:

我有一个 Pandas 数据框:

a=[1,1,1,2,2,2,3,3,3]
dic={'A':a}

df=pd.DataFrame(dic)

我对这个 df 应用了多索引:

index=[(1,'a'),(1,'b'),(1,'c'),(2,'a'),(2,'b'), (2, 'c'),(3,'a'),(3,'b'), (3,'c')]
df.index=pd.MultiIndex.from_tuples(index, names=['X','Y'])

我添加了一个新列:

df['B']='-'

现在我有一个 df:

       A   B 
X Y          
1 a    1   -
  b    1   -
  c    1   -
2 a    2   -
  b    2   -
  c    2   -
3 a    3   -
  b    3   -
  c    3   -

本质上,我想循环遍历多索引的 level='X',将一个级别添加到另一个级别,然后将值分配给 column='B'

这是我的想法:

dex=[]
for idx, select_df in df.groupby(level=0):
    dex.append(idx)
#gives me a list of level='X' keys

dex_iter=iter(dex)
#creates an iterator from that list

last=next(dex_iter)
#gives me the first value of that list of keys, and moves the iterator to the next value

for i in dex_iter:
    
    df.loc[i,'B']=df.loc[i,'A']+df.loc[last,'A']
    last=i

我的预期结果是:

      A   B
X Y        
1 a   1   -
  b   1   -
  c   1   -
2 a   2   3
  b   2   3
  c   2   3
3 a   3   5
  b   3   5
  c   3   5

相反,我得到的是:

      A    B
X Y        
1 a   1    -
  b   1    -
  c   1    -
2 a   2  NaN
  b   2  NaN
  c   2  NaN
3 a   3  NaN
  b   3  NaN
  c   3  NaN

这显然是由于将值分配给多索引的一些特殊性。但我找不到解决此问题的方法。

【问题讨论】:

    标签: python python-3.x pandas multi-index


    【解决方案1】:

    让我们试试groupbyfirstshift

    df.groupby(level=0)['A'].first().shift()
    
    X
    1    NaN
    2    1.0
    3    2.0
    Name: A, dtype: float64
    
    tmp = df.index.get_level_values(0).map(df.groupby(level=0)['A'].first().shift())
    print (tmp)
    # Float64Index([
    #    nan, nan, nan, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0], dtype='float64', name='X')
    

    这为您提供了需要添加到“A”以获得“B”的值:

    df['B'] = df['A'] + tmp
    df
    
         A    B
    X Y        
    1 a  1  NaN
      b  1  NaN
      c  1  NaN
    2 a  2  3.0
      b  2  3.0
      c  2  3.0
    3 a  3  5.0
      b  3  5.0
      c  3  5.0
    

    【讨论】:

      猜你喜欢
      • 2012-12-13
      • 2017-09-02
      • 2018-12-20
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多