Panda Serisi veya dizinini Numpy dizisine nasıl dönüştürebilirim?


264

Bir DataFrame dizini veya sütun NumPy dizi veya python listesi olarak almak nasıl biliyor musunuz?




1
NOT: Pandas DataFrame'i böyle bir diziye (veya listeye) dönüştürmek, diğer sorunların göstergesi olabilir. Bir DataFrame'in sizin kullanım durumunuz için uygun veri yapısı olmasını ve Pandas'ın ilgilendiğiniz işlemleri gerçekleştirmenin herhangi bir yolunu içermemesini önemle tavsiye ederim.
AMC

Yanıtlar:


353

NumPy dizisi elde etmek için şu valuesözelliği kullanmalısınız :

In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=['a', 'b', 'c']); df
   A  B
a  1  4
b  2  5
c  3  6

In [2]: df.index.values
Out[2]: array(['a', 'b', 'c'], dtype=object)

Bu, verilerin önceden nasıl depolandığına erişir, bu nedenle dönüştürmeye gerek yoktur.
Not: Bu özellik diğer birçok panda nesnesi için de kullanılabilir.

In [3]: df['A'].values
Out[3]: Out[16]: array([1, 2, 3])

Dizini liste olarak almak için şunu arayın tolist:

In [4]: df.index.tolist()
Out[4]: ['a', 'b', 'c']

Ve benzer şekilde, sütunlar için.


Not: .valueskullanımdan kaldırılmıştır, .to_numpy()NumPy dizisi istiyorsanız önerilen değiştirmedir. Genişleyebilir misiniz? Verilerin zaten nasıl depolandığına erişir, bu nedenle dönüştürmeye gerek yoktur ?
AMC

Cs95 tarafından cevap büyük bir açıklama verir .values, .to_numpy()ve .array.
AMC

75

Sen kullanabilirsiniz df.indexkullanarak bir liste halinde değerlere endeks nesneye erişmek ve daha sonra almak için df.index.tolist(). Benzer şekilde df['col'].tolist()Seri için de kullanabilirsiniz .


Bir liste dizisi değil instanceMethod döndürür
V Shreyas

12
@VShreyas, nasıl olurdf.index.values.tolist()
LancelotHolmes

3
df.index.tolist()bir örnek yöntemi döndürmez. Bir indeks listesi döndürür. Panda indeksinde tanımlanan bir yöntemdir. İlk olarak değerleri çağırmak bir olasılık olsa da, işi numpy'ye devretmek bir düzeltme değildir - sadece bir alternatif.
ayhan

51

pandalar> = 0.24

Kullanımınızı .valuesbu yöntemler lehine kaldırın !

İtibaren v0.24.0, biz iki markanın şaplak yeni, tercih dan NumPy diziler elde etme yöntemlerini olacak Index, Seriesve DataFramenesneleri: olduklarını to_numpy()ve .array. Kullanımla ilgili olarak dokümanlar şunları belirtiyor:

Biz kaldırılamaz veya kullanım dışı değil Series.valuesya DataFrame.values, ama biz çok tavsiye ve kullanma .arrayya da .to_numpy()onun yerine.

Daha fazla bilgi için v0.24.0 sürüm notlarının bu bölümüne bakın .


to_numpy() Yöntem

df.index.to_numpy()
# array(['a', 'b'], dtype=object)

df['A'].to_numpy()
#  array([1, 4])

Varsayılan olarak bir görünüm döndürülür. Yapılan değişiklikler orijinal belgeyi etkiler.

v = df.index.to_numpy()
v[0] = -1

df
    A  B
-1  1  2
b   4  5

Bunun yerine bir kopyasına ihtiyacınız varsa to_numpy(copy=True) kullanın ;

v = df.index.to_numpy(copy=True)
v[-1] = -123

df
   A  B
a  1  2
b  4  5

Bu işlevin DataFrames için de çalıştığını unutmayın (ancak .arrayçalışmaz).


arrayÖznitelik
Bu öznitelikExtensionArray, Dizin / Serileri destekleyenbirnesnedöndürür.

pd.__version__
# '0.24.0rc1'

# Setup.
df = pd.DataFrame([[1, 2], [4, 5]], columns=['A', 'B'], index=['a', 'b'])
df

   A  B
a  1  2
b  4  5

df.index.array    
# <PandasArray>
# ['a', 'b']
# Length: 2, dtype: object

df['A'].array
# <PandasArray>
# [1, 4]
# Length: 2, dtype: int64

Buradan aşağıdakileri kullanarak bir liste almak mümkündür list:

list(df.index.array)
# ['a', 'b']

list(df['A'].array)
# [1, 4]

veya doğrudan arayın .tolist():

df.index.tolist()
# ['a', 'b']

df['A'].tolist()
# [1, 4]

Neler iade edildiğine dair dokümanlar,

İçin Seriesve Indexnormal bir NumPy diziler tarafından desteklenen es, Series.array yeni dönecektir arrays.PandasArraybir etrafında ince (no-kopya) sarıcı olan numpy.ndarray. arrays.PandasArrayözellikle kendi başına yararlı değildir, ancak pandalarda veya üçüncü taraf bir kütüphane tarafından tanımlanan herhangi bir uzantı dizisiyle aynı arabirimi sağlar.

Özetlemek gerekirse, .arrayya dönecektir

  1. ExtensionArrayEndeksin / Dizinin mevcut desteğini veya
  2. Diziyi destekleyen bir NumPy dizisi varsa ExtensionArray, temel dizi üzerinde ince bir paket olarak yeni bir nesne oluşturulur.

İKİ yeni yöntem eklemek için gerekçe
Bu işlevler, iki GitHub sorunu GH19954 ve GH23623 altında yapılan tartışmalar sonucunda eklenmiştir .

Özellikle, dokümanlar gerekçeden bahseder:

[...] .valuesdöndürülen değerin gerçek dizi mi, bir miktar dönüşümü mü yoksa pandalar özel dizilerinden biri mi olacağı belli değildi Categorical. Örneğin, ile PeriodIndex, .values yeni bir oluşturur ndarraysüresinin her zaman nesneleri. [...]

Bu iki işlev, doğru yönde atılmış önemli bir adım olan API'nın tutarlılığını artırmayı amaçlamaktadır.

Son olarak, .valuesmevcut sürümde kullanımdan kaldırılmayacak, ancak bunun gelecekte bir noktada gerçekleşmesini bekliyorum, bu yüzden kullanıcıları mümkün olan en kısa sürede yeni API'ya geçiş yapmaya teşvik ediyorum.


48

Çok dizinli bir veri çerçevesi ile uğraşıyorsanız, yalnızca çok dizinin bir adının sütununu çıkarmak isteyebilirsiniz. Bunu şu şekilde yapabilirsiniz

df.index.get_level_values('name_sub_index')

ve tabii name_sub_indexunsuru olmalıdırFrozenList df.index.names


16

Panda v0.13'ten beri şunları da kullanabilirsiniz get_values:

df.index.get_values()

5
Bu ve .val değerleri arasında bir fark var mı? (Bu işlev 0.13.0 belgelerinden göründüğü için sürüm bilgisini güncelledim.)
Andy Hayden

@Andy Hayden: .get_values ​​değerinin yalnızca geçerli değerleri almanın resmi yolu olması bir fark değil mi?
Ezekiel Kruglick

@EzekielKruglick yani her zaman bir kopya mı? Belgelere bağlı çok hafif, böyle dupes almayı düşünmüyordum (MI'da olsalar bile. Değerlerinde olmayacaklar) bunu gösteren bir örnek görmek harika olurdu!
Andy Hayden

@AndyHayden: Bence yorumunu yanlış okuyordum. Haklısın, .values ​​iyidir, .level modası geçmiş ve get_values, bırakılan satırlar / sütunlar hariç geçerli değerleri size verir. Orijinal github sorunu: github.com/pydata/pandas/issues/3686 Ama sadece kontrol ettim ve .values ​​(tabii ki!) Güncel bilgileri sadece konuştuğumuz şeyden farklı olduğunu düşündüğümden farklı bir şekilde veriyor
Ezekiel Kruglick

1
@AndyHayden Hayır, hiçbir fark yok. get_valuessadece arar .values. Yazmak daha fazla karakter.
cs95

0

Ben pandaların dönüştürülen dataframeiçin listve daha sonra temel kullanılır list.index(). Bunun gibi bir şey:

dd = list(zone[0]) #Where zone[0] is some specific column of the table
idx = dd.index(filename[i])

Olarak dizin değeriniz var idx.


ve sonra () temel list.index kullanılan Nasıl bir listeye Series dönüştürme soruya şu ilişkilidir?
AMC

0

Bunu yapmanın daha yeni bir yolu .to_numpy () işlevini kullanmaktır.

Bir sütun 'fiyat' ile bir veri çerçevesi varsa, aşağıdaki gibi dönüştürebilirsiniz:

priceArray = df['price'].to_numpy()

Ayrıca, kayan nokta veya nesne gibi veri türünü işlevin bağımsız değişkeni olarak da iletebilirsiniz.


-1

Aşağıda, veri çerçevesi sütununu numpy dizisine dönüştürmenin basit bir yoludur.

df = pd.DataFrame(somedict) 
ytrain = df['label']
ytrain_numpy = np.array([x for x in ytrain['label']])

ytrain_numpy bir numpy dizisidir.

Ben denedim to.numpy()ama bana aşağıdaki hatayı verdi: TypeError: Doğrusal SVC kullanarak İkili Alaka sınıflandırma yaparken tipler için desteklenen dönüşüm: (dtype ('O'),) . to.numpy (), dataFrame öğesini numpy dizisine dönüştürüyordu, ancak yukarıdaki hatanın gözlemlendiği için iç öğenin veri türü listelendi.


To.numpy () ile denedim ama bana aşağıdaki hatayı verdi: TypeError: Doğrusal SVC kullanarak İkili Alaka sınıflandırma yaparken tipler için desteklenen dönüşüm yok: (dtype ('O'),). to.numpy (), dataFrame öğesini numpy dizisine dönüştürüyordu, ancak yukarıdaki hatanın gözlemlendiği için iç öğenin veri türü listelendi. Yine de bu gerçekten bir suç değil to_numpy.
AMC
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.