Pandas veri çerçevesine sütun olarak numpy dizisi ekleyin


85

Aşağıdaki gibi görünen bir Pandas veri çerçevesi nesnesi (X, Y) var:

[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]

ve buna benzer bir şekle (X, Z) sahip uyuşmuş bir seyrek matris (CSC)

[[0, 1, 0],
[0, 0, 1],
[1, 0, 0]]

Matristen içeriği yeni bir adlandırılmış sütundaki veri çerçevesine nasıl ekleyebilirim, böylece veri çerçevesi şu şekilde sona erecektir:

[[1, 2, 3, [0, 1, 0]],
[4, 5, 6, [0, 0, 1]],
[7, 8, 9, [1, 0, 0]]]

Veri çerçevesinin artık bir şekle (X, Y + 1) sahip olduğuna ve matristeki satırların veri çerçevesindeki öğeler olduğuna dikkat edin.


2
Bu tür bir yuvalama tavsiye edilmez. Bunu neden yapmanız gerekiyor?
Phillip Bulut


Birleştirmeden sonra matrisin önceki içeriğini tek bir sütun adıyla seçme olanağını korumak istiyorum.
Mihai Damian

Neden sadece iki DataFrames kullanmıyorsun ?
Phillip Bulut

Yanıtlar:


81
import numpy as np
import pandas as pd
import scipy.sparse as sparse

df = pd.DataFrame(np.arange(1,10).reshape(3,3))
arr = sparse.coo_matrix(([1,1,1], ([0,1,2], [1,2,0])), shape=(3,3))
df['newcol'] = arr.toarray().tolist()
print(df)

verim

   0  1  2     newcol
0  1  2  3  [0, 1, 0]
1  4  5  6  [0, 0, 1]
2  7  8  9  [1, 0, 0]

6
Sanırım böyle şeyler yapmakta ısrar eden kullanıcılar için gerçekten kurşun geçirmez ayakkabılar sağlayamayız: /
Phillip Cloud

6
Bir liste sütunuyla yapabileceğiniz ilginç şeyler var , bu yüzden bunun kötü bir fikir olduğunu varsaymamayı tercih ederim. Kabul etmeme rağmen, yüksek bir olasılık var.
unutbu

1
Bu harika bir pandasesneklik örneği . Bu soru durumunda , veriler eşit şekilli satırlara sahip homojen sayısal tiptedir, oysa bu örnekte bunlar listfarklı uzunluklardadır. Yapabileceğiniz ilginç şeyler olduğuna katılıyorum. Bununla birlikte, zaten bir matrisiniz varken neden onu bir liste listesine dönüştürsünüz?
Phillip Bulut

1
Buradaki "ilginç şey" ... onu artık bir liste sütunu yapmamak (yani yararlıdır)!
Andy Hayden

54
Yaratıcı insanların, herkesin aptalca olduğunu düşündüğü şeyleri yapmasına izin verildiğinde dünya daha iyi bir yerdir. :)
unutbu

10

Sütununuzda bir dizi depolamak yerine daha yüksek boyutlu bir veri yapısı ( Panel ) kullanmayı düşünün :

In [11]: p = pd.Panel({'df': df, 'csc': csc})

In [12]: p.df
Out[12]: 
   0  1  2
0  1  2  3
1  4  5  6
2  7  8  9

In [13]: p.csc
Out[13]: 
   0  1  2
0  0  1  0
1  0  0  1
2  1  0  0

Kesitlere vb. Bakın.

In [14]: p.xs(0)
Out[14]: 
   csc  df
0    0   1
1    1   2
2    0   3

Paneller hakkında daha fazla bilgi için belgelere bakın .


12
Panel kullanımdan kaldırıldı
guhur

Evet, günümüzde genellikle MultiIndex önerilir. Örneğin aracılığıyla oluşturulmuştur pd.concat([df, csc], axis=1, keys=["df", "csc"]).
Andy Hayden

A = np.eye(3); df = pd.concat( [A,A], axis=1 )-> TypeError: 20.2'de NDFrame olmayan bir nesne birleştirilemez mi? ("Pandalar-kullanımdan kaldırılmış-şimdi-bunu-kullan" wiki'si güzel olurdu.)
denis

@denis tryA = pd.DataFrame(np.eye(3)); df = pd.concat( [A,A], axis=1, keys=["A", "B"] )
Andy Hayden

Teşekkürler, df.columns MultiIndex(levels=[[u'A', u'B'], [0, 1, 2]](alnına vurur)
denis

3

İşte başka bir örnek:

import numpy as np
import pandas as pd

""" This just creates a list of touples, and each element of the touple is an array"""
a = [ (np.random.randint(1,10,10), np.array([0,1,2,3,4,5,6,7,8,9]))  for i in 
range(0,10) ]

""" Panda DataFrame will allocate each of the arrays , contained as a touple 
element , as column"""
df = pd.DataFrame(data =a,columns=['random_num','sequential_num'])

Genel olarak sır, veriyi a = [(dizi_11, dizi_12, ..., dizi_1n), ..., (dizi_m1, dizi_m2, ..., dizi_mn)] biçiminde tahsis etmektir ve panda DataFrame, verileri sıralar dizilerin n sütununda. Elbette, eşlemeler yerine dizi dizileri kullanılabilir, bu durumda form şu olur: a = [[dizi_11, dizi_12, ..., dizi_1n], ..., [dizi_m1, dizi_m2, ..., dizi_mn ]]

Yukarıdaki koddan (df) yazdırırsanız çıktı budur:

                       random_num                  sequential_num
0  [7, 9, 2, 2, 5, 3, 5, 3, 1, 4]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1  [8, 7, 9, 8, 1, 2, 2, 6, 6, 3]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2  [3, 4, 1, 2, 2, 1, 4, 2, 6, 1]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
3  [3, 1, 1, 1, 6, 2, 8, 6, 7, 9]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
4  [4, 2, 8, 5, 4, 1, 2, 2, 3, 3]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
5  [3, 2, 7, 4, 1, 5, 1, 4, 6, 3]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
6  [5, 7, 3, 9, 7, 8, 4, 1, 3, 1]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
7  [7, 4, 7, 6, 2, 6, 3, 2, 5, 6]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
8  [3, 1, 6, 3, 2, 1, 5, 2, 2, 9]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
9  [7, 2, 3, 9, 5, 5, 8, 6, 9, 8]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Yukarıdaki örneğin diğer varyasyonu:

b = [ (i,"text",[14, 5,], np.array([0,1,2,3,4,5,6,7,8,9]))  for i in 
range(0,10) ]
df = pd.DataFrame(data=b,columns=['Number','Text','2Elemnt_array','10Element_array'])

Df çıktısı:

   Number  Text 2Elemnt_array                 10Element_array
0       0  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1       1  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2       2  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
3       3  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
4       4  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
5       5  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
6       6  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
7       7  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
8       8  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
9       9  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Başka dizi sütunları eklemek istiyorsanız, o zaman:

df['3Element_array']=[([1,2,3]),([1,2,3]),([1,2,3]),([1,2,3]),([1,2,3]),([1,2,3]),([1,2,3]),([1,2,3]),([1,2,3]),([1,2,3])]

Df'nin son çıktısı şöyle olacaktır:

   Number  Text 2Elemnt_array                 10Element_array 3Element_array
0       0  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
1       1  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
2       2  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
3       3  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
4       4  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
5       5  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
6       6  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
7       7  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
8       8  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
9       9  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]

1

Bunu kullanarak dataframe'den bir numpy dizisi ekleyebilir ve alabilirsiniz:

import numpy as np
import pandas as pd

df = pd.DataFrame({'b':range(10)}) # target dataframe
a = np.random.normal(size=(10,2)) # numpy array
df['a']=a.tolist() # save array
np.array(df['a'].tolist()) # retrieve array

Bu, seyrek kısım nedeniyle kafamı karıştıran önceki cevaba dayanıyor ve bu seyrek olmayan bir uyuşuk dizi için iyi çalışıyor.


0
df = pd.DataFrame(np.arange(1,10).reshape(3,3))
df['newcol'] = pd.Series(your_2d_numpy_array)
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.