2017-04-14 102 views
5

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

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 

回答

4

可以使用.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

+2

这是值得注意的,如。 'df = df.assign(c ='some_value',b ='some_value')'确实按字母顺序将列添加到原始数据框中。所以生成的数据框将有列a b c而不是c b。 –

+1

@Cpt_Jauchefuerst,好点,谢谢!我已将它添加到答案 – MaxU

1

事实证明,你可以使用一个循环做到这一点:

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

可以单独设置他们,如果你只处理一个几列:

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

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

+0

这是我希望避免的,因为实际上我需要添加更多的列。 –

+0

够公平的,我从原始问题不确定需要多大的范围 – Elliptica

4

一个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 
相关问题