将函数应用于 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_pd
(Pandas.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 [重复]