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.