Python pandaları: bir veri çerçevesi satırını satır satır doldurun


133

Bir pandas.DataFramenesneye bir satır eklemenin basit görevini başarmak zor görünüyor. Bununla ilgili, hiçbiri işe yarayan bir yanıt vermeyen 3 yığın aşımı sorusu vardır.

İşte yapmaya çalıştığım şey. Satırların ve sütunların adlarının yanı sıra şeklini de zaten bildiğim bir DataFrame'im var.

>>> df = pandas.DataFrame(columns=['a','b','c','d'], index=['x','y','z'])
>>> df
     a    b    c    d
x  NaN  NaN  NaN  NaN
y  NaN  NaN  NaN  NaN
z  NaN  NaN  NaN  NaN

Şimdi, satırların değerlerini yinelemeli olarak hesaplamak için bir fonksiyonum var. Satırlardan birini bir sözlük veya a ile nasıl doldurabilirim pandas.Series? İşte başarısız olan çeşitli girişimler:

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df['y'] = y
AssertionError: Length of values does not match length of index

Görünüşe göre satır yerine sütun eklemeye çalıştı.

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.join(y)
AttributeError: 'builtin_function_or_method' object has no attribute 'is_unique'

Hiç bilgilendirici olmayan hata mesajı.

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.set_value(index='y', value=y)
TypeError: set_value() takes exactly 4 arguments (3 given)

Görünüşe göre bu sadece veri çerçevesindeki bireysel değerleri ayarlamak için.

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.append(y)
Exception: Can only append a Series if ignore_index=True

Pekala, dizini görmezden gelmek istemiyorum, aksi takdirde sonuç şu:

>>> df.append(y, ignore_index=True)
     a    b    c    d
0  NaN  NaN  NaN  NaN
1  NaN  NaN  NaN  NaN
2  NaN  NaN  NaN  NaN
3    1    5    2    3

Sütun adlarını değerlerle hizaladı, ancak satır etiketlerini kaybetti.

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.ix['y'] = y
>>> df
                                  a                                 b  \
x                               NaN                               NaN
y  {'a': 1, 'c': 2, 'b': 5, 'd': 3}  {'a': 1, 'c': 2, 'b': 5, 'd': 3}
z                               NaN                               NaN

                                  c                                 d
x                               NaN                               NaN
y  {'a': 1, 'c': 2, 'b': 5, 'd': 3}  {'a': 1, 'c': 2, 'b': 5, 'd': 3}
z                               NaN                               NaN

Bu da sefil bir şekilde başarısız oldu.

Peki bunu nasıl yapacaksınız?

Yanıtlar:


92

df['y'] bir sütun oluşturacak

bir satır ayarlamak istediğiniz için kullanın .loc

.ixBurada eşdeğer olduğuna dikkat edin , sizinki başarısız oldu çünkü ymuhtemelen istediğiniz şey değil , satırın her bir öğesine bir sözlük atamaya çalıştınız ; Diziye dönüştürmek, pandalara girişi hizalamak istediğinizi söyler (örneğin, daha sonra tüm öğeleri belirtmeniz gerekmez)

In [7]: df = pandas.DataFrame(columns=['a','b','c','d'], index=['x','y','z'])

In [8]: df.loc['y'] = pandas.Series({'a':1, 'b':5, 'c':2, 'd':3})

In [9]: df
Out[9]: 
     a    b    c    d
x  NaN  NaN  NaN  NaN
y    1    5    2    3
z  NaN  NaN  NaN  NaN

Anlıyorum. Dolayısıyla, locveri çerçevesinin niteliği, __setitem__tahmin ettiğim sihri yapan özel bir özelliği tanımlar .
xApple

Bunu tek geçişte oluşturabilir misiniz (yani sütun, dizin ve y ile)?
Andy Hayden

5
Öyleyse, her seferinde bir satır oluşturabilirsem, veri çerçevesini en iyi şekilde nasıl oluşturabilirim?
xApple

Bir varyasyonunu bekliyordum df = pd.DataFrame({'y': pd.Series(y)}, columns=['a','b','c','d'], index=['x','y','z'])işe?
Andy Hayden

@xApple prob sizin için en iyisi, bir dikt listesi (veya liste) oluşturup ardından kurucuya geçmeniz çok daha verimli olacaktır
Jeff

71

Yaklaşımım öyleydi, ancak bunun en hızlı çözüm olduğunu garanti edemem.

df = pd.DataFrame(columns=["firstname", "lastname"])
df = df.append({
     "firstname": "John",
     "lastname":  "Johny"
      }, ignore_index=True)

4
Bu benim için harika bir şekilde çalıştı appendve verileri açıkça veri çerçevesine aktarmanız hoşuma gitti.
Jonny Brooks

1
Bu yanıtın her satıra sütun adının eklenmesini gerektirdiğini unutmayın. Kabul edilen cevap için aynı.
17:53 pashute

Bu, satır sayısını önceden bilmiyorsanız da işe yarar.
irene

34

Bu daha basit bir versiyon

import pandas as pd
df = pd.DataFrame(columns=('col1', 'col2', 'col3'))
for i in range(5):
   df.loc[i] = ['<some value for first>','<some value for second>','<some value for third>']`

4
sormak istiyorum, bu CPU ve bellek verimli mi?
czxttkl

1
df'nin son satırını nasıl bilebilirim, böylece her seferinde son satıra eklerim?
2017

25

Giriş satırlarınız sözlük yerine listelerse, aşağıdaki basit bir çözümdür:

import pandas as pd
list_of_lists = []
list_of_lists.append([1,2,3])
list_of_lists.append([4,5,6])

pd.DataFrame(list_of_lists, columns=['A', 'B', 'C'])
#    A  B  C
# 0  1  2  3
# 1  4  5  6

ama çoklu indeksim varsa ne yapmalıyım? df1 = pd.DataFrame (list_of_lists, sütunlar ['A', 'B', 'C'], dizin = ['A', 'B']) çalışmıyor. Yanlış şekil. Nasıl?
2017, saat
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.