将函数应用于 Pandas.DataFrame 中两列的每个组合的更好方法

Posted

技术标签:

【中文标题】将函数应用于 Pandas.DataFrame 中两列的每个组合的更好方法【英文标题】:Better way to apply function to every combination of two columns in 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()那样做就更好了。

【问题讨论】:

【参考方案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 来说已经足够了,但我是新来的,还没有这个特权 把它变成了一个答案。做得好。抱歉,由于缺乏技术知识,我无法投票。

以上是关于将函数应用于 Pandas.DataFrame 中两列的每个组合的更好方法的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用tabulate函数将pandas dataframe以类似于plsql表格的方式打印出来(printing dataframe in tabular format)

重新采样 MultiIndexed Pandas DataFrame 并将不同的函数应用于列

如何将阈值应用于 pandas DataFrame 列并输出阈值之外的行?

如何将方法应用于 Pandas Dataframe [重复]

将多个过滤器应用于 pandas DataFrame 或 Series 的有效方法

Pandas DataFrame 函数应用和映射