Pandas veri çerçevesine sabit değere sahip sütun ekleyin [yineleme]


104

Bir DataFrame verildiğinde:

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 gibi sabit bir değer içeren yeni bir sütun eklemenin en basit yolu nedir?

          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

Bu benim çözümüm, ancak bunun neden NaN'yi 'yeni' sütuna koyduğunu bilmiyorum?

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
bir dizin kullanırsanız sorun değil. df['new'] = pd.Series([0 for x in range(len(df.index))], index=df.index).
zach

5
ayrıca, burada bir liste anlama tamamen gereksizdir. just do[0] * len(df.index)
acushner

@joris, df ['new'] = 0'ın neden tüm sütuna sıfır atamanın doğru olduğunu gösterdiğini kastetmiştim, ancak ilk denememin neden NaN eklediğini açıklamıyor. Bu, kabul ettiğim cevapta Philip Cloud tarafından cevaplandı.
yemu

7
Simply dodf['new'] = 0
flow2k

Yanıtlar:


22

Bu koyar nedeni NaNçünkü bir sütuna olan df.indexve Indexsağ tarafta gösterilen bir nesnenin farklı. @zach, yeni bir sıfır sütunu atamanın doğru yolunu gösterir. Genel pandasolarak, endeksleri olabildiğince fazla hizalamaya çalışır. Tek dezavantajı endeksleri hizalanmamıştır aldığınız olduğunu NaNonlar her yerde değil hizalanmış. Kısmen, tamamen ve tamamen hizalı olmayan indislere sahip nesnelerle hizalama çalışmaları için bir miktar önsezi kazanmak için reindexve alignyöntemleriyle oynayın . Örneğin DataFrame.align(), kısmen hizalanmış endekslerle şu şekilde çalışır:

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

11
i downvote yoktu ancak kod o sen pasajı başarmaya çalıştığımız ile birlikte takip etmek zor hale getirir, yorum yoksun
tazmin

8
Bu soruya gerçekten cevap vermiyor. OP, sabit bir değer içeren yeni bir sütunun nasıl ekleneceğini soruyor.
cs95

Burada tek bir soru olduğuna katılmıyorum . "Bir sütuna nasıl sabit bir değer atayabilirim?" yanı sıra "Bunu yapma girişimim X şekilde çalışmıyor, neden beklenmedik şekilde davranıyor?" Birincisi başka bir yanıta atıfta bulunarak her iki noktaya değindiğime inanıyorum. Lütfen cevabımdaki tüm metni okuyun .
Phillip Cloud

Sorunun cevabınızdan çok soruyla ilgili olduğunu düşünüyorum. Bu yazıda iki farklı soru var ve sonuç olarak soruyu cevaplamak için iki farklı cevap gerekiyor. Bunun çok geniş olarak işaretlenmesi ve afişin iki ayrı soru sorması gerektiğine inanıyorum.
Kevin

90

Süper basit yerinde atama: df['new'] = 0

Yerinde değişiklik için doğrudan atama gerçekleştirin. Bu ödev, her satır için pandalar tarafından yayınlanır.

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

Nesne sütunları için not

Boş listelerden oluşan bir sütun eklemek istiyorsanız, işte tavsiyem:

  • Bunu yapmamayı düşünün. objectsütunlar performans açısından kötü haberdir. Verilerinizin nasıl yapılandırıldığını yeniden düşünün.
  • Verilerinizi seyrek bir veri yapısında depolamayı düşünün. Daha fazla bilgi: seyrek veri yapıları
  • Bir liste sütununu depolamanız gerekiyorsa, aynı referansı birden çok kez kopyalamadığınızdan emin olun.

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

Bir kopya oluşturma: df.assign(new=0)

Bunun yerine bir kopyasına ihtiyacınız varsa, şunu kullanın 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

Ve aynı değere sahip bu tür birden çok sütunu atamanız gerekirse, bu,

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

Birden çok sütun ataması

Son olarak, farklı değerlere sahip birden çok sütun atamanız gerekiyorsa assign, bir sözlükle kullanabilirsiniz .

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

21

Modern pandalarla şunları yapabilirsiniz:

df['new'] = 0

1
Hangi spesifik cevapların güncel olmadığını söyleyebilir misiniz? Altlarına bir yorum bırakalım ki yazarların gelişme şansı olsun.
cs95

1
Fyi, bu yanıt ile cs95 (AKA, ben) yanıtı arasındaki tek fark sütun adı ve değeridir. Tüm parçalar orada.
cs95

1
Güncel olmadıkları kadar değil, ancak bu cevap diğerlerine göre daha az ayrıntılı ve okunması daha kolay.
Joey

1
@Joey Bu mantıkla tartışamıyorum, sanırım bu yanıt, kütüphane hakkında daha fazlasını anlamak ve öğrenmek yerine, işe yarayacak herhangi bir şeyi kopyalayıp yapıştırmak isteyenler için daha uygun. Touche.
cs95

1
@ cs95 evet cevabınız insanların daha fazla öğrenmesine izin veriyor. Ayrıca başlıkta vurgulanan df ['new'] = 0 okunabilirlik için iyidir. Ben de buna olumlu oy verdim. Df.apply'den daha az ayrıntılı (lambda x: 0, axis = 1)
Joey

7

İşte lambdas kullanan başka bir astar (sabit değer = 10 olan sütun oluşturun)

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

önce

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

sonra

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'] = 10aynı zamanda tek astarlıdır (ve daha hızlıdır). Burada uygula kullanmanın avantajı nedir?
cs95

2
burada sizinle rekabet etmeye çalışmıyorum - sadece alternatif bir yaklaşım gösteriyorum.
Grant Shannon

@ cs95 Bu yararlıdır. Her değerin ayrı bir boş liste olduğu yeni bir sütun oluşturmak istedim. Sadece bu yöntem işe yarar.
Yatharth Agarwal

@YatharthAgarwal Size bunu vereceğim, ancak pandaların liste sütunlarıyla iyi çalışacak şekilde tasarlanmaması da mantıklı.
cs95

1
@YatharthAgarwal Boş listeler atamanız gerekiyorsa bu yine de bir subpar çözümdür çünkü uygula'yı kullanır. Deneyindf['new'] = [[] for _ in range(len(df))]
cs95
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.