Python 相当于 R interaction() 函数
Python equivalent of the R interaction() function
是否有直接的方法在 python 中的不同变量之间产生交互?例如,在 R 中,假设我有 3 个不同的因素要考虑:a、b 和 c,我想创建一个新变量来显示这三个因素针对特定观察的特定组合。
> a = c(1, 2, 2, 2, 3)
> b = c(2, 3, 3, 3, 2)
> c = c('m', 'm', 'f', '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, 2, 2, 2, 3]
, 'b': [2, 3, 3, 3, 2]
, 'c': ['m', 'm', 'f', 'f', 'f']})
我可以使用以下内容按照我正在寻找的内容进行制作:
df['d'] = df.a.astype(str) + '_' + df.b.astype(str) + '_' + df.c
是否已经有内置函数或方法可以完成此操作?我想唯一的区别是我不必事先明确输入这些因素。
使用 Series.str.cat
方法与多个 Series
:
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 提出的任何方法都要慢。
是否有直接的方法在 python 中的不同变量之间产生交互?例如,在 R 中,假设我有 3 个不同的因素要考虑:a、b 和 c,我想创建一个新变量来显示这三个因素针对特定观察的特定组合。
> a = c(1, 2, 2, 2, 3)
> b = c(2, 3, 3, 3, 2)
> c = c('m', 'm', 'f', '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, 2, 2, 2, 3]
, 'b': [2, 3, 3, 3, 2]
, 'c': ['m', 'm', 'f', 'f', 'f']})
我可以使用以下内容按照我正在寻找的内容进行制作:
df['d'] = df.a.astype(str) + '_' + df.b.astype(str) + '_' + df.c
是否已经有内置函数或方法可以完成此操作?我想唯一的区别是我不必事先明确输入这些因素。
使用 Series.str.cat
方法与多个 Series
:
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 提出的任何方法都要慢。