Python等效于R interact函数

问题描述

有没有一种直接的方法可以在python中的不同变量之间产生交互?例如,在R中,假设我要考虑3个不同的因素:a,b和c,并且我想创建一个新变量,以针对特定观察显示这三个因素的特定组合。

> a = c(1,2,3)
> b = c(2,3,2)
> c = c('m','m','f','f')
> interaction(a,b,c)
[1] 1.2.m 2.3.m 2.3.f 2.3.f 3.2.f
12 Levels: 1.2.f 2.2.f 3.2.f 1.3.f 2.3.f 3.3.f 1.2.m 2.2.m 3.2.m ... 3.3.m

我希望能够使用此交互概念在pandas数据框中创建新列。例如,假设我有数据框:

df = pd.DataFrame({"a": [1,3],'b': [2,2],'c': ['m','f']})

我可以使用以下内容根据我要寻找的内容制作东西:

df['d'] = df.a.astype(str) + '_' + df.b.astype(str) + '_' + df.c

是否已经有内置的函数方法可以完成此任务?我想唯一的区别是,我不必事先明确键入因子。

解决方法

对多个Series使用Series.str.cat方法:

df['d'] = df.a.astype(str).str.cat([df.b.astype(str),df.c],sep='.')
print (df)
   a  b  c      d
0  1  2  m  1.2.m
1  2  3  m  2.3.m
2  2  3  f  2.3.f
3  2  3  f  2.3.f
4  3  2  f  3.2.f

或与DataFrame-选定的b,c列:

df['d'] = df.a.astype(str).str.cat(df[['b','c']].astype(str),sep='.')
print (df)
   a  b  c      d
0  1  2  m  1.2.m
1  2  3  m  2.3.m
2  2  3  f  2.3.f
3  2  3  f  2.3.f
4  3  2  f  3.2.f

对于所有列到新列:

df['d'] = df.astype(str).agg('.'.join,axis=1)
#alternative
df['d'] = df.astype(str).apply('.'.join,axis=1)
print (df)
   a  b  c      d
0  1  2  m  1.2.m
1  2  3  m  2.3.m
2  2  3  f  2.3.f
3  2  3  f  2.3.f
4  3  2  f  3.2.f
,

将所有内容设置为字符串,将每一行转换为一个列表,并加入列表元素:

df.astype(str).apply(list,axis=1).str.join(".")
#0    1.2.m
#1    2.3.m
#2    2.3.f
#3    2.3.f
#4    3.2.f

这种方法比您的方法快,但比@jezrael提出的方法要慢。