首页 文章

将变换应用于Pandas数据帧时如何获取索引和列名?

提问于
浏览
0

给定两个多索引数据帧(df1和df2),我想将df1分组并进行转换 . 在这个转换中,我想将相应的数组从df2添加到df1 .

import pandas and pd
import numpy as np

def do_transform(x):
    return np.add(x, df2.ix(_index_of_x, _column_name_of_x))

df1.groupby(level=[0,1]).transform(do_transform)

如何在Pandas转换中检索索引和列名?

EDIT:

df1和df2具有行大小,但df2包含更多列 .

1 回答

  • 2

    我认为多指数级别的联合可能更好?

    无论如何进行转换;对于scari的问题,我会假设相同的大小 .

    """
    # data1.csv
    alpha,beta,gamma
    A,1,2
    A,1,4
    A,2,6
    B,3,8
    B,3,10
    B,4,12
    
    
    # data2.csv
    alpha,beta,gamma
    A,1,20
    A,1,40
    A,2,60
    B,3,80
    B,3,100
    B,4,120
    """
    
    df1 = pd.read_csv('data1.csv')
    df2 = pd.read_csv('data2.csv')
    
    df1.set_index(['alpha','beta'],inplace=True)
    df2.set_index(['alpha','beta'],inplace=True)
    
    def do_transform(x):
        return x + df2.loc[df2.index.isin(x.index)]
    
    print df1.groupby(level=[0,1]).transform(lambda x: do_transform(x)).head(len(df1))
    

    这将产生

    gamma
    alpha beta       
    A     1        22
          1        44
          2        66
    B     3        88
          3       110
          4       132
    

    如果你有多个列,它可以正常工作 .

    import pandas as pd
    import numpy as np
    """
    # data1.csv
    alpha,beta,gamma,omega
    A,1,2,1
    A,1,4,1
    A,2,6,1
    B,3,8,1
    B,3,10,1
    B,4,12,1
    
    
    # data2.csv
    alpha,beta,gamma,omega
    A,1,20,2
    A,1,40,2
    A,2,60,2
    B,3,80,2
    B,3,100,2
    B,4,120,2
    """
    
    df1 = pd.read_csv('data1.csv')
    df2 = pd.read_csv('data2.csv')
    
    df1.set_index(['alpha','beta'],inplace=True)
    df2.set_index(['alpha','beta'],inplace=True)
    
    def do_transform(x):
        return x + df2.loc[x.index.unique(),:]
    
    print df1.groupby(level=[0,1]).transform(lambda x: do_transform(x)).head(len(df1))
    

    生产环境 :

    gamma  omega
    alpha beta              
    A     1        22      3
          1        44      3
          2        66      3
    B     3        88      3
          3       110      3
          4       132      3
    

相关问题