【问题标题】:Add multiple columns to DataFrame and set them equal to an existing column将多列添加到 DataFrame 并将它们设置为等于现有列
【发布时间】:2017-04-20 18:25:39
【问题描述】:

我想将多个列添加到 pandas DataFrame 并将它们设置为等于现有列。有没有一种简单的方法可以做到这一点?在R 我会这样做:

df <- data.frame(a=1:5)
df[c('b','c')] <- df$a
df
  a b c
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
5 5 5 5

pandas 中,这导致KeyError: "['b' 'c'] not in index"

df = pd.DataFrame({'a': np.arange(1,6)})
df[['b','c']] = df.a

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以使用.assign()方法:

    In [31]: df.assign(b=df['a'], c=df['a'])
    Out[31]:
       a  b  c
    0  1  1  1
    1  2  2  2
    2  3  3  3
    3  4  4  4
    4  5  5  5
    

    或者更有创意的方法:

    In [41]: cols = list('bcdefg')
    
    In [42]: df.assign(**{col:df['a'] for col in cols})
    Out[42]:
       a  b  c  d  e  f  g
    0  1  1  1  1  1  1  1
    1  2  2  2  2  2  2  2
    2  3  3  3  3  3  3  3
    3  4  4  4  4  4  4  4
    4  5  5  5  5  5  5  5
    

    另一种解决方案:

    In [60]: pd.DataFrame(np.repeat(df.values, len(cols)+1, axis=1), columns=['a']+cols)
    Out[60]:
       a  b  c  d  e  f  g
    0  1  1  1  1  1  1  1
    1  2  2  2  2  2  2  2
    2  3  3  3  3  3  3  3
    3  4  4  4  4  4  4  4
    4  5  5  5  5  5  5  5
    

    注意:@Cpt_Jauchefuerst 在评论 DataFrame.assign(z=1, a=1) 中提到将按字母顺序添加列 - 即首先将 a 添加到现有列,然后将 z 添加。

    【讨论】:

    • 值得注意的是,例如。 df = df.assign(c='some_value', b='some_value') 确实按字母顺序将列添加到原始数据框中。所以生成的数据框将有列 a b c 而不是 a c b。
    • @Cpt_Jauchefuerst,好点子,谢谢!我已将其添加到答案中
    【解决方案2】:

    pd.concat 方法

    df = pd.DataFrame(dict(a=range5))
    
    pd.concat([df.a] * 5, axis=1, keys=list('abcde'))
    
       a  b  c  d  e
    0  0  0  0  0  0
    1  1  1  1  1  1
    2  2  2  2  2  2
    3  3  3  3  3  3
    4  4  4  4  4  4
    

    【讨论】:

      【解决方案3】:

      原来你可以使用循环来做到这一点:

      for i in ['b','c']: df[i] = df.a
      

      【讨论】:

        【解决方案4】:

        如果您只处理几列,则可以单独设置它们:

        df['b'] = df['a']
        df['c'] = df['a']
        

        或者你可以使用你发现的循环。

        【讨论】:

        • 这是我希望避免的,因为实际上我需要添加更多列。
        • 很公平,从最初的问题中我不确定需要多大的范围
        猜你喜欢
        • 2020-03-16
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 2016-10-10
        • 2018-12-21
        • 1970-01-01
        • 2022-11-16
        相关资源
        最近更新 更多