Listeden veri çerçevesine sütun ekle


95

Bunun gibi bazı sütunlara sahip bir veri çerçevem ​​var:

A   B   C  
0   
4
5
6
7
7
6
5

A değerleri mümkün aralık sadece 0 ile 7 arasında olan .

Ayrıca, bunun gibi 8 öğeden oluşan bir listem var:

List=[2,5,6,8,12,16,26,32]  //There are only 8 elements in this list

A sütunundaki eleman ise n , ben eklemek gerekir n , yeni bir sütunda Listesi'nden inci elemanı 'D' derler.

Tüm veri çerçevesi üzerinde döngü oluşturmadan bunu tek seferde nasıl yapabilirim?

Elde edilen veri çerçevesi şöyle görünecektir:

A   B   C   D
0           2
4           12
5           16
6           26
7           32
7           32
6           26
5           16

Not: Veri çerçevesi çok büyüktür ve yineleme son seçenektir. Ancak, gerekirse dict gibi başka herhangi bir veri yapısındaki 'Liste'deki öğeleri de düzenleyebilirim.


1
Bence istenen sonuca sahip (daha küçük) bir oyuncak örneğine ihtiyacınız var. Kulağa biraz belirsiz geliyor.
Andy Hayden

11
Asla bir değişkene "Liste" demeyin. Herhangi bir dilde.
lucid_dreamer

Yanıtlar:


51

IIUC, eğer (ne yazık ki adını) Listbir ndarrayyaparsanız, doğal olarak indeksleyebilirsiniz.

>>> import numpy as np
>>> m = np.arange(16)*10
>>> m[df.A]
array([  0,  40,  50,  60, 150, 150, 140, 130])
>>> df["D"] = m[df.A]
>>> df
    A   B   C    D
0   0 NaN NaN    0
1   4 NaN NaN   40
2   5 NaN NaN   50
3   6 NaN NaN   60
4  15 NaN NaN  150
5  15 NaN NaN  150
6  14 NaN NaN  140
7  13 NaN NaN  130

Burada yeni bir tane inşa ettim m, ancak kullanırsanız m = np.asarray(List), aynı şey çalışmalı: içindeki değerler df.A, uygun unsurları seçecektir m.


Eski bir sürümünü numpykullanıyorsanız m[df.A.values]bunun yerine kullanmanız gerekebileceğini unutmayın - geçmişte numpybaşkalarıyla iyi oynamadı ve bazı yeniden düzenleme pandasbazı baş ağrısına neden oldu. Artık işler gelişti.


Merhaba @DSM. Ne dediğini anlıyorum ama şu hatayı alıyorum: Traceback (most recent call last): File "./b.py", line 24, in <module> d["D"] = m[d.A] IndexError: unsupported iterator index
mane

1
@mane: urf, bu eski bir numpyhata. Does d["D"] = m[d.A.values]işi sizin için?
DSM

277

Listeyi doğrudan atamanız yeterlidir:

df['new_col'] = mylist

Alternatif
Listeyi bir dizi veya diziye dönüştürün ve ardından şunları atayın:

se = pd.Series(mylist)
df['new_col'] = se.values

veya

df['new_col'] = np.array(mylist)

3
pykernel_launcher.py:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy """Entry point for launching an IPython kernel.
Ilya Rusin

@sparrow dtype'ı pd.Seriesetkileyecek mi? Demek istediğim, float'lar olarak float'lar ve string'ler olarak string'ler bırakacak mı? Veya listedeki öğeler varsayılan olarak dizeleri mi alacak?
3kstc

2
@IlyaRusin, bu durumda göz ardı edilebilecek yanlış bir pozitiftir. Daha fazla bilgi için: stackoverflow.com/questions/20625582/…
sparrow

1
Bu, şu şekilde basitleştirilebilir: df ['new_col'] = pd.Series (mylist) .values
smartse

16

@ Sparrow'dan harika olanı iyileştiren bir çözüm.

Let df sizin veri kümesi olmak, ve myList sen dataframe eklemek istediğiniz değerleri listesiyle.

Yeni sütununuzu basitçe new_column olarak adlandırmak istediğinizi varsayalım

Önce listeyi bir Seri haline getirin:

column_values = pd.Series(mylist)

Sonra kullanmak insert sütun eklemek işlevini. Bu işlevin, sütunu hangi konuma yerleştirmek istediğinizi seçmenize izin verme avantajı vardır. Aşağıdaki örnekte, yeni sütunu soldan ilk konuma yerleştireceğiz (loc = 0 ayarlayarak)

df.insert(loc=0, column='new_column', value=column_values)

Df indekslerinizi 1,2,3 dışında bir şeye değiştirdiyseniz bu işe yaramayacaktır ... bu durumda satırlar arasına eklemeniz gerekir: column_values.index = df.index
Guy s

8

Öncelikle sahip olduğunuz veri çerçevesini oluşturalım, B ve C sütunlarını ilgisiz oldukları için göz ardı edeceğim.

df = pd.DataFrame({'A': [0, 4, 5, 6, 7, 7, 6,5]})

Ve arzu ettiğiniz haritalama:

mapping = dict(enumerate([2,5,6,8,12,16,26,32]))

df['D'] = df['A'].map(mapping)

Bitti!

print df

Çıktı:

   A   D
0  0   2
1  4  12
2  5  16
3  6  26
4  7  32
5  7  32
6  6  26
7  5  16

1
Bence OP bunu nasıl yapacağını zaten biliyor. Okurken sorun şu Döğelerin öğelerinden inşa ediliyor Ave List("A sütunundaki öğe n ise, Listeden n'inci öğeyi yeni bir sütuna eklemem gerekiyor, 'D' deyin.")
DSM

SO bir tür F (* & dadı durumuna dönüştü. @DSM'ye yorum için teşekkürler ama hakem tarafından incelenene kadar yazıyı düzeltemedim. Ve sonra çok hızlı olduğu için reddedildi. Ve sonra ben) kendi düzenlememi gözden geçirebiliyorum. ve sonra artık çok geç çünkü daha kötü (IMHO) bir yanıt "kabul edildi". SO gerçekten yardımcı olmaktan çok daha az yardımcı olan bazı meta-dadılara sahip !!!!
Phil Cooper

Dadılar adına konuşamam, ancak yaklaşımınızın uzun dizilerde daha yavaş olduğunu göreceksiniz. Diğer açılardan, elbette, arasında seçim yapmak np.array(List)[df.A]ve df["A"].map(dict(enumerate(List)))çoğunlukla bir tercih meselesidir.
DSM

Merhaba Phil, Sadece çözümünüzü ve DSM'nin yorumunu gördüm ve sonra DSM'nin çözümü benim için iyi çalıştığı için asla geri dönmedim. Ama şimdi çözümünüze bakınca da işe yarıyor. DSM'nin çözümünü yaklaşık 200 bin girişlik veri setimde çalıştırdım ve sahip olduğum diğer tüm hesaplamalarla birkaç saniye içinde çalışıyor. Ben python-pandalarda tamamen yeniyim ve şahsen zarif veya harika bir şey aramıyordum; her ne işe yaradı iyiydi. Ama dürüst olmak gerekirse, çözüm için teşekkürler.
mane

2

Eski soru; ama her zaman en hızlı kodu kullanmaya çalışırım!

69 milyon uint64 içeren büyük bir listem vardı. np.array () benim için en hızlıydı.

df['hashes'] = hashes
Time spent: 17.034842014312744

df['hashes'] = pd.Series(hashes).values
Time spent: 17.141014337539673

df['key'] = np.array(hashes)
Time spent: 10.724546194076538
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.