Pandas veri çerçevesine bir satır ekle


112

Bir veri çerçevem ​​var:

s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])

df = pd.DataFrame([list(s1), list(s2)],  columns =  ["A", "B", "C"])

   A  B  C
0  5  6  7
1  7  8  9

[2 rows x 3 columns]

ve şunu elde etmek için ilk satırı [2, 3, 4] eklemem gerekiyor:

   A  B  C
0  2  3  4
1  5  6  7
2  7  8  9

Denedim append()ve çalıştım concat()ama bunun nasıl yapılacağı konusunda doğru yolu bulamıyorum.

Dataframe'e seri nasıl eklenir / eklenir?


6
kullanarak tamamen yeni bir liste oluşturmak s1.valuesyerine kullanmanın daha iyi olduğunu unutmayın . list(s1)list(s1)
acushner

7
Bu kadar basit olması gereken bir şey baş belası ve bu kadar yavaşken neden herkesin pandaları bu kadar çok sevdiğini anlamıyorum.
MattCochrane

Yanıtlar:


145

Aşağıdakileri kullanarak belirli bir dizine satır atamanız yeterlidir loc:

 df.loc[-1] = [2, 3, 4]  # adding a row
 df.index = df.index + 1  # shifting index
 df = df.sort_index()  # sorting by index

Ve istediğiniz gibi elde edersiniz:

    A  B  C
 0  2  3  4
 1  5  6  7
 2  7  8  9

Pandalar belgelerine bakın İndeksleme: Büyütmeyle ayarlama .


2
Büyütme ile ayarlamak istemiyor, ancak veri çerçevesinin içine eklemek istiyorsanız, stackoverflow.com/questions/15888648/…
FooBar

6
. endeksi alternatifi kayması: df.sort () reset_index (damla = True)
Meloun

2
df.sort kullanımdan kaldırıldı, df.sort_index ()
GBGOLC

1
@Piotr - bu harika çalışıyor, ancak veri çerçevenizdeki gibi bir satırı çoğaltmak df.loc[-1] = df.iloc[[0]]ve eklemek istediğinizde ne olur ? Çerçeve, hata veren ek bir dizin sütunuyla birlikte gelir ValueError: cannot set a row with mismatched columns (bkz. Stackoverflow.com/questions/47340571/… )
Growler

5
Python dizileri için olduğu gibi son satır / eleman olmadığı df.loc[-1] = [2, 3, 4] # adding a rowgibi biraz yanıltıcı olduğunu düşünüyorum -1.
flow2k

27

Nasıl aradığınızdan emin değilim, concat()ancak her iki nesne de aynı türden olduğu sürece çalışmalıdır. Belki sorun, ikinci vektörünüzü bir veri çerçevesine dönüştürmeniz gerekmesidir? Aşağıdaki tanımladığınız df'yi kullanmak benim için çalışıyor:

df2 = pd.DataFrame([[2,3,4]], columns=['A','B','C'])
pd.concat([df2, df])

En iyi cevap ^ :)
Cam.Davidson.Pilon

23

Bunu başarmanın bir yolu

>>> pd.DataFrame(np.array([[2, 3, 4]]), columns=['A', 'B', 'C']).append(df, ignore_index=True)
Out[330]: 
   A  B  C
0  2  3  4
1  5  6  7
2  7  8  9

Genel olarak, en kolayı seri değil, veri çerçevesi eklemektir. Sizin durumunuzda, yeni satırın "üstte" olmasını (başlangıç ​​id'si ile) olmasını istediğinizden ve hiçbir işlev olmadığından, pd.prepend()önce yeni veri çerçevesini oluşturup sonra eskisini ekliyorum.

ignore_indexveri çerçevenizdeki eski devam eden dizini yok sayacak ve ilk satırın dizin 1ile yeniden başlamak yerine gerçekten dizinle başlamasını sağlayacaktır 0.

Tipik Sorumluluk Reddi: Cetero censeo ... satır eklemek oldukça verimsiz bir işlemdir. Performansta önem ve her nasılsa ilk doğru (uzun) indeksi ve sonra sadece bir dataframe oluşturmak için garanti altına alabiliyorsa takmadan dataframe içine ilave bir satır, kesinlikle yapmalıyız. Görmek:

>>> index = np.array([0, 1, 2])
>>> df2 = pd.DataFrame(columns=['A', 'B', 'C'], index=index)
>>> df2.loc[0:1] = [list(s1), list(s2)]
>>> df2
Out[336]: 
     A    B    C
0    5    6    7
1    7    8    9
2  NaN  NaN  NaN
>>> df2 = pd.DataFrame(columns=['A', 'B', 'C'], index=index)
>>> df2.loc[1:] = [list(s1), list(s2)]

Şimdiye kadar sahip olduğunuz şeye sahibiz df:

>>> df2
Out[339]: 
     A    B    C
0  NaN  NaN  NaN
1    5    6    7
2    7    8    9

Ama şimdi satırı aşağıdaki gibi kolayca ekleyebilirsiniz. Alan önceden tahsis edildiğinden, bu daha verimlidir.

>>> df2.loc[0] = np.array([2, 3, 4])
>>> df2
Out[341]: 
   A  B  C
0  2  3  4
1  5  6  7
2  7  8  9

Bu güzel bir çözüm, veri çerçevesine seriler eklemeye çalışıyordum. Şu anda benim için yeterince iyi.
Meloun

En son seçeneği beğendim. Bu gerçekten yapmak istediklerime gerçekten uyuyor. Teşekkürler @FooBar!
Jade Cacho

13

Satır eklerken biraz daha fazla esneklik sağlayan kısa bir işlevi bir araya getirdim:

def insert_row(idx, df, df_insert):
    dfA = df.iloc[:idx, ]
    dfB = df.iloc[idx:, ]

    df = dfA.append(df_insert).append(dfB).reset_index(drop = True)

    return df

bu daha da kısaltılabilir:

def insert_row(idx, df, df_insert):
    return df.iloc[:idx, ].append(df_insert).append(df.iloc[idx:, ]).reset_index(drop = True)

O zaman şöyle bir şey kullanabilirsiniz:

df = insert_row(2, df, df_new)

nerede 2dizin konumudur dfEklemek istediğiniz yere df_new.


7

Kullanabiliriz numpy.insert. Bunun esneklik avantajı vardır. Yalnızca eklemek istediğiniz dizini belirtmeniz gerekir.

s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])

df = pd.DataFrame([list(s1), list(s2)],  columns =  ["A", "B", "C"])

pd.DataFrame(np.insert(df.values, 0, values=[2, 3, 4], axis=0))

    0   1   2
0   2   3   4
1   5   6   7
2   7   8   9

For np.insert(df.values, 0, values=[2, 3, 4], axis=0), 0 işleve yeni değerleri yerleştirmek istediğiniz yeri / dizini söyler.


6

bu aşırı basit görünebilir, ancak basit bir yeni satır ekleme işlevinin yerleşik olmaması inanılmaz. Orijinaline yeni bir df eklemek hakkında çok şey okudum, ancak bunun daha hızlı olup olmayacağını merak ediyorum.

df.loc[0] = [row1data, blah...]
i = len(df) + 1
df.loc[i] = [row2data, blah...]

Kodunuzun gösterdiği gibi "yeni bir df eklemek" mi yoksa yalnızca "yeni bir satır eklemek" mi demek istediniz?
smci

üzgünüm cümlem net değildi. Tamamen yeni bir veri çerçevesini tek bir satırla birleştiren / ekleyen diğer insan çözümlerini okudum. ancak benim çözümümde, mevcut veri çerçevesinde sadece tek bir satır ek bir veri çerçevesinin oluşturulmasına gerek yok
Aaron Melgar

6

Aşağıda, bir dizini sıralayıp sıfırlamadan pandalar veri çerçevesine bir satır eklemenin en iyi yolu şu olacaktır:

import pandas as pd

df = pd.DataFrame(columns=['a','b','c'])

def insert(df, row):
    insert_loc = df.index.max()

    if pd.isna(insert_loc):
        df.loc[0] = row
    else:
        df.loc[insert_loc + 1] = row

insert(df,[2,3,4])
insert(df,[8,9,0])
print(df)

neden bunun en iyi yol olduğunu söylüyorsun?
Yuca

o zaman bu iddiayı desteklemek için kanıt sağlamak güzel olurdu, zamanladınız mı?
Yuca

1
numpy'yi içe aktarmaktan kaçınmak için pd.isna'yı kullanabilirsiniz
kato2

2

Pandalara bir satır eklemek oldukça basittir DataFrame:

  1. Sizinle aynı sütun adlarına sahip normal bir Python sözlüğü oluşturun Dataframe;

  2. pandas.append()Yöntem kullanın ve sözlüğünüzün adını girin; burada .append()DataFrame örneklerinde bir yöntem vardır;

  3. Ekle ignore_index=Truesözlüğünü adından sonra sağa.


Bu muhtemelen en çok tercih edilen seçenektir (yaklaşık 2020).
David Golembiowski

1

concat()son satır eklemeden ve yeniden dizine eklemeden biraz daha hızlı görünüyor. Birinin en iyi iki yaklaşımın hızını merak etmesi durumunda:

In [x]: %%timeit
     ...: df = pd.DataFrame(columns=['a','b'])
     ...: for i in range(10000):
     ...:     df.loc[-1] = [1,2]
     ...:     df.index = df.index + 1
     ...:     df = df.sort_index()

Döngü başına 17,1 s ± 705 ms (ortalama ± std. Sapma 7 çalıştırma, her biri 1 döngü)

In [y]: %%timeit
     ...: df = pd.DataFrame(columns=['a', 'b'])
     ...: for i in range(10000):
     ...:     df = pd.concat([pd.DataFrame([[1,2]], columns=df.columns), df])

Döngü başına 6,53 s ± 127 ms (ortalama ± std. Sapma 7 çalıştırma, her biri 1 döngü)


0

Satırı DataFrame'in sonuna ekleyebilir ve ardından dizini ayarlayabilirsiniz.

Örneğin:

df = df.append(pd.DataFrame([[2,3,4]],columns=df.columns),ignore_index=True)
df.index = (df.index + 1) % len(df)
df = df.sort_index()

Veya şu şekilde kullanın concat:

df = pd.concat([pd.DataFrame([[1,2,3,4,5,6]],columns=df.columns),df],ignore_index=True)

-1

Pandalar veri çerçevesine satır eklemenin en basit yolu şudur:

DataFrame.loc[ location of insertion ]= list( )

Misal :

DF.loc[ 9 ] = [ ´Pepe , 33, ´Japan ]

NB: listenizin uzunluğu veri çerçevesi ile eşleşmelidir.


benim için hile yaptı!
Sam Shaw
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.