Python pandaları: Seçili sütunu Series yerine DataFrame olarak tut


92

Pandalar DataFrame'den tek bir sütun seçerken (örneğin df.iloc[:, 0], df['A']veya df.A, vb.), Elde edilen vektör, tek sütunlu bir DataFrame yerine otomatik olarak bir Seriye dönüştürülür. Ancak, bir DataFrame'i girdi bağımsız değişkeni olarak alan bazı işlevler yazıyorum. Bu nedenle, işlevin df.columns'un erişilebilir olduğunu varsayabilmesi için Series yerine tek sütunlu DataFrame ile uğraşmayı tercih ederim. Şu anda, gibi bir şey kullanarak Serileri açıkça bir DataFrame'e dönüştürmem gerekiyor pd.DataFrame(df.iloc[:, 0]). Bu en temiz yöntem gibi görünmüyor. Doğrudan bir DataFrame'den indekslemenin daha zarif bir yolu var mı, böylece sonuç Series yerine tek sütunlu bir DataFrame olur?


6
df.iloc [:, [0]] veya df [['A']]; df.A ancak bir dizi geri verecek
Jeff

Yanıtlar:


99

@ Jeff'in bahsettiği gibi, bunu yapmanın birkaç yolu var, ancak daha açık olmak için loc / iloc kullanmanızı tavsiye ederim (ve belirsiz bir şey deniyorsanız hataları erken artırın):

In [10]: df = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B'])

In [11]: df
Out[11]:
   A  B
0  1  2
1  3  4

In [12]: df[['A']]

In [13]: df[[0]]

In [14]: df.loc[:, ['A']]

In [15]: df.iloc[:, [0]]

Out[12-15]:  # they all return the same thing:
   A
0  1
1  3

Son iki seçenek, tamsayı sütun adları durumunda belirsizliği ortadan kaldırır (tam olarak neden loc / iloc yaratılmıştır). Örneğin:

In [16]: df = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 0])

In [17]: df
Out[17]:
   A  0
0  1  2
1  3  4

In [18]: df[[0]]  # ambiguous
Out[18]:
   A
0  1
1  3

2
Rahatsız ettiğim için özür dilerim, ama bununla ilgili gerçekten hızlı bir soru. Fazladan []sonucun sonucu a DataFrameyerine nasıl a yaptığını görüyorum Series, ancak pandas dokümanlarında bu tür bir dizin oluşturma sözdizimi nerede tartışılıyor? Ben sadece bu endeksleme tekniğinin "resmi" adını almaya çalışıyorum, böylece gerçekten anlayabileyim. Teşekkürler!
sparc_spread

3
@sparc_spread pandas.pydata.org/pandas-docs/stable/indexing.html#basics "Sütunları bu sırayla seçmek için [] 'ye bir sütun listesi geçirebilirsiniz." Bunun bir adı olup olmadığından emin değilim!
Andy Hayden

Evet, yokmuş gibi görünüyor - ama bundan sonra kullanmaya devam edeceğim. Hem API hem de dokümanlarda bu kadar çok şey gömülü olması şaşırtıcı. Teşekkürler!
sparc_spread

Bu ayrım benim için yararlı oldu, çünkü bazen tek bir sütun DataFrame istiyorum, böylece Series'de kullanılamayan veriler üzerinde DataFrame yöntemlerini kullanabilirim. (ISTR, çizim yöntemi farklı davrandı). Tek öğeli bir liste kullanabileceğimi fark ettiğimde bu benim için bir tezahürdü!
RufusVS

4

As Andy Hayden önerir, endeks dışarı (tek sütunlu) dataframe gitmek yoludur için .iloc / .loc kullanan; Dikkat edilmesi gereken bir diğer nokta da dizin konumlarının nasıl ifade edileceğidir. Bir kullan listelenen Endeksi etiket / pozisyonları Dataframe olarak endekse argüman değerlerini belirterek iken; aksi takdirde bir 'pandas.core.series.Series' döndürülür

Giriş:

    A_1 = train_data.loc[:,'Fraudster']
    print('A_1 is of type', type(A_1))
    A_2 = train_data.loc[:, ['Fraudster']]
    print('A_2 is of type', type(A_2))
    A_3 = train_data.iloc[:,12]
    print('A_3 is of type', type(A_3))
    A_4 = train_data.iloc[:,[12]]
    print('A_4 is of type', type(A_4))

Çıktı:

    A_1 is of type <class 'pandas.core.series.Series'>
    A_2 is of type <class 'pandas.core.frame.DataFrame'>
    A_3 is of type <class 'pandas.core.series.Series'>
    A_4 is of type <class 'pandas.core.frame.DataFrame'>

1

Kullanabilirsiniz, df.iloc[:, 0:1]bu durumda ortaya çıkan vektör bir DataFramedizi değil bir dizi olacaktır.

Gördüğün gibi:

görüntü açıklamasını buraya girin


1

Bu üç yaklaşımdan bahsedildi:

pd.DataFrame(df.loc[:, 'A'])  # Approach of the original post
df.loc[:,[['A']]              # Approach 2 (note: use iloc for positional indexing)
df[['A']]                     # Approach 3

pd.Series.to_frame () başka bir yaklaşımdır.

Bir yöntem olduğu için yukarıdaki ikinci ve üçüncü yaklaşımların uygulanmadığı durumlarda kullanılabilir. Özellikle, veri çerçevenizdeki bir sütuna bir yöntem uygularken ve çıktıyı bir dizi yerine bir veri çerçevesine dönüştürmek istediğinizde kullanışlıdır. Örneğin, bir Jupyter Not Defterinde bir dizi güzel çıktıya sahip olmayacak, ancak bir veri çerçevesi olacaktır.

# Basic use case: 
df['A'].to_frame()

# Use case 2 (this will give you pretty output in a Jupyter Notebook): 
df['A'].describe().to_frame()

# Use case 3: 
df['A'].str.strip().to_frame()

# Use case 4: 
def some_function(num): 
    ...

df['A'].apply(some_function).to_frame()
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.