2017-04-14 11 views
5

pandasDataFrameに複数の列を追加し、それらを既存の列と同じに設定したいとします。これを行う簡単な方法はありますか? Rで私はどうなる:pandas複数の列を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 

を、これは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ではなくa 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 
関連する問題