2017-04-14 70 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