【问题标题】:Python equivalent of the R interaction() functionR 交互()函数的 Python 等效项
【发布时间】:2020-09-21 05:12:24
【问题描述】:

有没有一种直接的方法可以在 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

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

【问题讨论】:

    标签: python pandas dataframe interaction


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案2】:

      将所有内容都变成字符串,将每一行转换为列表,加入列表元素:

      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 提出的任何方法都慢。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-13
        • 1970-01-01
        • 1970-01-01
        • 2020-03-18
        • 2019-02-09
        • 1970-01-01
        • 2019-10-04
        相关资源
        最近更新 更多