Seri ve DataFrame nasıl birleştirilir


83

Buraya bir DataFrameve Seriesdizini nasıl birleştireceğiniz konusunda bilgi almak için geldiyseniz , lütfen bu yanıta bakın .

OP'nin asıl amacı, başka bir DataFrame'e sütun olarak seri elemanlarının nasıl atanacağını sormaktı . Bunun cevabını bilmekle ilgileniyorsanız, EdChum tarafından kabul edilen cevaba bakın.


Bulabildiğim en iyi şey

df = pd.DataFrame({'a':[1, 2], 'b':[3, 4]})  # see EDIT below
s = pd.Series({'s1':5, 's2':6})

for name in s.index:
    df[name] = s[name]

   a  b  s1  s2
0  1  3   5   6
1  2  4   5   6

Daha iyi sözdizimi / daha hızlı yöntem öneren var mı?

Denemelerim:

df.merge(s)
AttributeError: 'Series' object has no attribute 'columns'

ve

df.join(s)
ValueError: Other Series must have a name

DÜZENLE Gönderilen ilk iki yanıt sorumla ilgili bir sorunu vurguladı, bu nedenle lütfen oluşturmak için aşağıdakileri kullanın df:

df = pd.DataFrame({'a':[np.nan, 2, 3], 'b':[4, 5, 6]}, index=[3, 5, 6])

nihai sonuçla

    a  b  s1  s2
3 NaN  4   5   6
5   2  5   5   6
6   3  6   5   6

Yanıtlar:


26

Seriden bir veri çerçevesi oluşturabilir ve ardından veri çerçevesiyle birleştirebilirsiniz. Dolayısıyla, verileri değerler olarak belirtir, ancak bunları uzunlukla çarparsınız, sütunları dizine ayarlar ve left_index ve right_index için parametreleri True olarak ayarlarsınız:

In [27]:

df.merge(pd.DataFrame(data = [s.values] * len(s), columns = s.index), left_index=True, right_index=True)
Out[27]:
   a  b  s1  s2
0  1  3   5   6
1  2  4   5   6

Diziden oluşturduğunuz df dizininin df'nin dizinini kullanmasını istediğiniz durum için DÜZENLE , ardından aşağıdakileri yapabilirsiniz:

df.merge(pd.DataFrame(data = [s.values] * len(df), columns = s.index, index=df.index), left_index=True, right_index=True)

Bu, indislerin uzunlukla eşleştiğini varsayar.


168

Güncelleme
v0.24.0'dan itibaren, Seri adlandırıldığı sürece DataFrame ve Serileri birleştirebilirsiniz.

df.merge(s.rename('new'), left_index=True, right_index=True)
# If series is already named,
# df.merge(s, left_index=True, right_index=True)

Günümüzde, Series'i to_frame () ile bir DataFrame'e dönüştürebilirsiniz . Yani (dizine katılıyorsa):

df.merge(s.to_frame(), left_index=True, right_index=True)

6
Sorunun dfve tanımlarını kullanarak s, bu cevap benim için soruda istenen sonucu değil , boş bir veri çerçevesi döndürüyor . Endekste eşleştirmek istemiyoruz; sdeğerleri tüm satırlarına yayınlamak istiyoruz df.
CPBL

2
Bu, farklı bir problemi çözüyor: "bir DataFrame ve Seri verildiğinde, indekste nasıl birleştirilebilirler". OP'nin sorusu "bir Serinin her bir öğesini bir Veri Çerçevesinde yeni bir sütun olarak atayın" idi.
cs95

5

İşte bir yol:

df.join(pd.DataFrame(s).T).fillna(method='ffill')

Burada olanları parçalamak için ...

pd.DataFrame(s).Tsşuna benzeyen tek satırlı bir DataFrame oluşturur :

   s1  s2
0   5   6

Ardından, joinbu yeni çerçeveyi şununla birleştirir df:

   a  b  s1  s2
0  1  3   5   6
1  2  4 NaN NaN

Son olarak, NaN1. dizindeki değerler fillna, forward-fill ( ffill) argümanı kullanılarak sütundaki önceki değerlerle doldurulur :

   a  b  s1  s2
0  1  3   5   6
1  2  4   5   6

Kullanmaktan kaçınmak için fillna, pd.concatoluşturulan DataFrame satırlarını tekrarlamak mümkündür s. Bu durumda genel çözüm şudur:

df.join(pd.concat([pd.DataFrame(s).T] * len(df), ignore_index=True))

İşte düzenlenen soruda ortaya çıkan dizin oluşturma sorununu ele almak için başka bir çözüm:

df.join(pd.DataFrame(s.repeat(len(df)).values.reshape((len(df), -1), order='F'), 
        columns=s.index, 
        index=df.index))

sdeğerleri tekrarlayarak ve yeniden şekillendirerek ('Fortran' sırasını belirterek) ve ayrıca uygun sütun adları ve dizini geçerek bir DataFrame'e dönüştürülür. Bu yeni DataFrame daha sonra df.


Güzel tek satırlık bir uyarı, zaten df'de bulunan NaN'lerin de doldurulacağıdır.
Nathan Lloyd

@Nonth Teşekkürler ve iyi nokta. NaNDeğerleri doldurmaktan kaçınan bir alternatif eklemek için düzenledim .
Alex Riley

EdChums orijinal cevabında olanlar, bu revize edilmiş cevabı etkiler. Df'yi diyelim ki ile inşa edersem index=[3, 5], yeni sütunlarda komutunuzdan sonra nanlar bulunur.
Nathan Lloyd

@Nonth Yeniden Düzenlendi! Artık yeni gereksinimlerinizi karşılamalıdır.
Alex Riley

cevabınız 20 kat daha hızlıdır, ancak yine de 1e5 satırda df ile ~ 100 ms'lik bir farktır. For döngüm korkunç derecede yavaş. BTW Yanıtınızda 2gerektiğini olmak len(df)genellikle geçerli olmak üzere.
Nathan Lloyd

0

Veri çerçevelerinizi şu şekilde ayarlamayı önerebilseydim (otomatik indeksleme):

df = pd.DataFrame({'a':[np.nan, 1, 2], 'b':[4, 5, 6]})

o zaman s1 ve s2 değerlerinizi şu şekilde ayarlayabilirsiniz (df'den satır sayısını döndürmek için shape () kullanarak):

s = pd.DataFrame({'s1':[5]*df.shape[0], 's2':[6]*df.shape[0]})

o zaman istediğiniz sonuç kolaydır:

display (df.merge(s, left_index=True, right_index=True))

Alternatif olarak, yeni değerleri dataframe df'nize ekleyin:

df = pd.DataFrame({'a':[nan, 1, 2], 'b':[4, 5, 6]})
df['s1']=5
df['s2']=6
display(df)

Her ikisi de dönüş:

     a  b  s1  s2
0  NaN  4   5   6
1  1.0  5   5   6
2  2.0  6   5   6

Başka bir veri listeniz varsa (uygulanacak tek bir değer yerine) ve bunun df ile aynı sırayla olduğunu biliyorsanız, örneğin:

s1=['a','b','c']

o zaman bunu aynı şekilde ekleyebilirsiniz:

df['s1']=s1

İadeler:

     a  b s1
0  NaN  4  a
1  1.0  5  b
2  2.0  6  c

0

Pandas.DataFrame sütununu bir sabite kolayca ayarlayabilirsiniz. Bu sabit, örneğinizdeki gibi bir int olabilir. Belirttiğiniz sütun df'de değilse, pandalar belirttiğiniz adla yeni bir sütun oluşturur. Dolayısıyla, veri çerçeveniz oluşturulduktan sonra (sorunuza göre):

df = pd.DataFrame({'a':[np.nan, 2, 3], 'b':[4, 5, 6]}, index=[3, 5, 6])

Sadece çalıştırabilirsiniz:

df['s1'], df['s2'] = 5, 6

Gerçek verilerinizi nasıl depoladığınıza bağlı olarak, bunu bir tuple listesindeki tüm öğeler için veya bir sözlükteki anahtarlar ve değerler için yapmak için bir döngü veya kavrama yazabilirsiniz.


0

Bir dfise, pandas.DataFrameo df['new_col']= Series list_object of length len(df)zaman veya Series list_object öğesini adlı bir sütun olarak ekler 'new_col'. df['new_col']= scalar(sizin durumunuzda 5 veya 6 gibi) de çalışır ve eşdeğerdirdf['new_col']= [scalar]*len(df)

Dolayısıyla iki satırlı bir kod amaca hizmet eder:

df = pd.DataFrame({'a':[1, 2], 'b':[3, 4]})
s = pd.Series({'s1':5, 's2':6})
for x in s.index:    
    df[x] = s[x]

Output: 
   a  b  s1  s2
0  1  3   5   6
1  2  4   5   6
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.