【问题标题】:Better way to apply function to every combination of two columns in Pandas.DataFrame将函数应用于 Pandas.DataFrame 中两列的每个组合的更好方法
【发布时间】:2017-02-10 22:11:42
【问题描述】:

我想实现一个类似于DataFrame.corr() 的东西,它可以将函数应用于成对列。 例如。 我有一个功能:

def func(x, y):
    pass

我想将func 应用于a_pdPandas.DataFrame 的类型)中两列的每个组合。我想出了一个方法,通过创建一个新函数wap_func 来包装func

def wap_func(x):
    for i in range(len(x)):
        for j in range(i+1, len(x)):
            func(x[i], x[j])

res = a_pd.apply(wap_func, axis=1)

虽然问题似乎解决了,但并不方便。如果能像a_pd.corr()那样做就更好了。

【问题讨论】:

    标签: python function pandas apply


    【解决方案1】:

    您是否考虑过使用itertools.combinations 模块?

    import pandas as pd
    from itertools import combinations
    
    df = pd.DataFrame([[1,2,3], [2,3,4], [3,5,7]], columns = ['A', 'B', 'C'])
    print(df)
    
       A  B  C
    0  1  2  3
    1  2  3  4
    2  3  5  7
    

    稍微不同地定义你的函数,以便你可以更无缝地使用 apply

    def func(xy):
        x, y = xy
        return x+y
    

    使用itertools.combinations模块获取你想要的所有列组合,依次遍历每个组合,并应用之前定义的函数

    for combi in combinations(df.columns, 2):
        df['_'.join([i for i in combi])] = df[[i for i in combi]].apply(func, axis=1, result_type='expand').transpose().values
    
    print(df)
    
       A  B  C  A_B  A_C  B_C
    0  1  2  3    3    4    5
    1  2  3  4    5    6    7
    2  3  5  7    8   10   12
    

    【讨论】:

    • 对不起!现在提供一个例子:)我确实想发表评论,因为我认为评论对 OP 来说已经足够了,但我是新来的,还没有这个特权
    • 把它变成了一个答案。做得好。抱歉,由于缺乏技术知识,我无法投票。
    猜你喜欢
    • 2021-12-27
    • 2019-03-01
    • 1970-01-01
    • 2014-05-20
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    相关资源
    最近更新 更多