パンダのデータフレームに定数値の列を追加[複製]


102

DataFrameが与えられた場合:

np.random.seed(0)
df = pd.DataFrame(np.random.randn(3, 3), columns=list('ABC'), index=[1, 2, 3])
df

          A         B         C
1  1.764052  0.400157  0.978738
2  2.240893  1.867558 -0.977278
3  0.950088 -0.151357 -0.103219

0などの定数値を含む新しい列を追加する最も簡単な方法は何ですか?

          A         B         C  new
1  1.764052  0.400157  0.978738    0
2  2.240893  1.867558 -0.977278    0
3  0.950088 -0.151357 -0.103219    0

これが私の解決策ですが、なぜこれがNaNを「新しい」列に入れるのかわかりませんか?

df['new'] = pd.Series([0 for x in range(len(df.index))])

          A         B         C  new
1  1.764052  0.400157  0.978738  0.0
2  2.240893  1.867558 -0.977278  0.0
3  0.950088 -0.151357 -0.103219  NaN

9
インデックスを使用する場合は問題ありません。df['new'] = pd.Series([0 for x in range(len(df.index))], index=df.index)
zach 2014年

5
また、ここではリスト内包表記はまったく不要です。ただやる[0] * len(df.index)
acushner 2014年

@joris、つまりdf ['new'] = 0は、列全体にゼロを割り当てる適切な理由を示していますが、最初の試行でNaNが挿入される理由は説明されていません。これは私が受け入れた答えの中でフィリップクラウドによって答えられました。
yemu 2014年

7
単にんdf['new'] = 0
flow2k

回答:


21

このプット理由NaN列には、ためているdf.indexIndex、あなたの右手側のオブジェクトのは異なっています。@zachは、ゼロの新しい列を割り当てる適切な方法を示しています。一般に、pandas可能な限り多くのインデックスの調整を試みます。欠点の1つは、インデックスが整列されていないNaN場合、整列されていない場所に移動することです。遊んでreindexalign、部分的に持っているオブジェクトとの位置合わせ作品のいくつかの直感を得るための方法、完全、かつ、整列されていない、すべての整列のインデックスを。たとえばDataFrame.align()、部分的に整列されたインデックスを使用する方法は次のとおりです。

In [7]: from pandas import DataFrame

In [8]: from numpy.random import randint

In [9]: df = DataFrame({'a': randint(3, size=10)})

In [10]:

In [10]: df
Out[10]:
   a
0  0
1  2
2  0
3  1
4  0
5  0
6  0
7  0
8  0
9  0

In [11]: s = df.a[:5]

In [12]: dfa, sa = df.align(s, axis=0)

In [13]: dfa
Out[13]:
   a
0  0
1  2
2  0
3  1
4  0
5  0
6  0
7  0
8  0
9  0

In [14]: sa
Out[14]:
0     0
1     2
2     0
3     1
4     0
5   NaN
6   NaN
7   NaN
8   NaN
9   NaN
Name: a, dtype: float64

9
私は反対票を投じませんでしたが、あなたのコードにはコメントがなく、スニペットで達成しようとしていることをフォローするのが難しくなっています
2017年

8
これは実際には質問に答えません。OPは、定数値を含む新しい列を追加する方法について質問しています。
cs 9519

ここに質問が1つしかないことに同意しません。「列に定数値を割り当てるにはどうすればよいですか?」があります。また、「これを実行しようとしてもXの方法では機能しません。なぜ、予期しない動作をするのですか?」私は両方の点に対処したと思います。最初は別の答えを参照することです。私の答えのすべてのテキストを読んでください。
フィリップクラウド

問題はあなたの答えではなく質問にあると思います。この投稿には2つの異なる質問が含まれているため、質問に回答するには2つの異なる回答が必要です。これは広すぎるとしてフラグを立てるべきであり、ポスターは2つの別々の質問をするべきだったと思います。
ケビン

83

超簡単なインプレース割り当て: df['new'] = 0

インプレース変更の場合は、直接割り当てを実行します。この割り当ては、各行のパンダによってブロードキャストされます。

df = pd.DataFrame('x', index=range(4), columns=list('ABC'))
df

   A  B  C
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x

df['new'] = 'y'
# Same as,
# df.loc[:, 'new'] = 'y'
df

   A  B  C new
0  x  x  x   y
1  x  x  x   y
2  x  x  x   y
3  x  x  x   y

オブジェクト列に関する注意

空のリストの列を追加したい場合は、次のアドバイスがあります。

  • これを行わないことを検討してください。object列はパフォーマンスの点で悪いニュースです。データがどのように構造化されているかを再考してください。
  • データをスパースデータ構造に格納することを検討してください。詳細:スパースデータ構造
  • リストの列を保存する必要がある場合は、同じ参照を複数回コピーしないようにしてください。

    # Wrong
    df['new'] = [[]] * len(df)
    # Right
    df['new'] = [[] for _ in range(len(df))]
    

コピーの生成: df.assign(new=0)

代わりにコピーが必要な場合は、次を使用してDataFrame.assignください。

df.assign(new='y')

   A  B  C new
0  x  x  x   y
1  x  x  x   y
2  x  x  x   y
3  x  x  x   y

そして、同じ値でそのような複数の列を割り当てる必要がある場合、これは次のように簡単です。

c = ['new1', 'new2', ...]
df.assign(**dict.fromkeys(c, 'y'))

   A  B  C new1 new2
0  x  x  x    y    y
1  x  x  x    y    y
2  x  x  x    y    y
3  x  x  x    y    y

複数列の割り当て

最後に、異なる値で複数の列を割り当てる必要がある場合assignは、辞書で使用できます。

c = {'new1': 'w', 'new2': 'y', 'new3': 'z'}
df.assign(**c)

   A  B  C new1 new2 new3
0  x  x  x    w    y    z
1  x  x  x    w    y    z
2  x  x  x    w    y    z
3  x  x  x    w    y    z

17

現代のパンダを使用すると、次のことができます。

df['new'] = 0

1
どの特定の回答が古くなっているかを指摘できますか?それらの下にコメントを残して、作者が改善する機会を得られるようにしましょう。
cs95

1
Fyiこの回答とcs95(AKA、私)の回答の唯一の違いは、列の名前と値です。すべてのピースがあります。
cs95

1
それらが古くなっていることはそれほど多くありませんが、この回答は他の回答よりも冗長ではなく、読みやすくなっています。
ジョーイ

1
@Joeyその論理に異議を唱えることはできません。この回答は、ライブラリについて理解して学習するよりも、機能するものをコピーして貼り付けたいだけの人に適していると思います。Touche。
cs95

1
@ cs95はい、あなたの答えは人々にもっと学ぶことを可能にします。また、タイトルで強調表示されているdf ['new'] = 0は、読みやすくなっています。私もそれを支持しました。df.apply(lambda x:0、axis = 1)よりも冗長ではありません
Joey

7

これはラムダを使用した別の1つのライナーです定数値= 10で列を作成します)

df['newCol'] = df.apply(lambda x: 10, axis=1)

df
    A           B           C
1   1.764052    0.400157    0.978738
2   2.240893    1.867558    -0.977278
3   0.950088    -0.151357   -0.103219

df
        A           B           C           newCol
    1   1.764052    0.400157    0.978738    10
    2   2.240893    1.867558    -0.977278   10
    3   0.950088    -0.151357   -0.103219   10

5
df['newCol'] = 10ワンライナーでもあります(そしてより高速です)。ここでapplyを使用する利点は何ですか?
cs 9519

2
ここであなたと競争しようとはしていません-ただ別のアプローチを示しています。
グラントシャノン

@ cs95これは役に立ちます。各値が個別の空のリストである新しい列を作成したかったのです。この方法のみが機能します。
YatharthAgarwal19年

@YatharthAgarwalそれをお伝えしますが、パンダがリストの列でうまく機能するように設計されていないことを考えると、それも理にかなっています。
cs 9519

1
@YatharthAgarwal空のリストを割り当てる必要がある場合でも、applyを使用するため、これは標準以下のソリューションです。試してみてくださいdf['new'] = [[] for _ in range(len(df))]
cs95
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.