panda veri çerçevesi sütunundan liste al


289

Ben böyle bir excel belge var ..

cluster load_date   budget  actual  fixed_price
A   1/1/2014    1000    4000    Y
A   2/1/2014    12000   10000   Y
A   3/1/2014    36000   2000    Y
B   4/1/2014    15000   10000   N
B   4/1/2014    12000   11500   N
B   4/1/2014    90000   11000   N
C   7/1/2014    22000   18000   N
C   8/1/2014    30000   28960   N
C   9/1/2014    53000   51200   N

Sütun 1 - küme içeriğini bir liste olarak döndürmek istiyorum, bu yüzden bir for döngüsü üzerinden çalıştırabilir ve her küme için bir excel çalışma sayfası oluşturabilirsiniz.

Bütün bir satırın içeriğini bir listeye döndürmek de mümkün müdür? Örneğin

list = [], list[column1] or list[df.ix(row1)]

10
Pandalar veri çerçevesi sütunları, onları çıkardığınızda bir panda serisidir, daha sonra .tolist()bunları bir python listesine dönüştürmek için arayabilirsiniz
Ben

4
V0.24'ten itibaren .valuesaltta yatan numpy dizilerine erişmek için tercih edilen yöntem ARTIK OLMAYACAKTIR. Bu cevaba bakınız .
cs95

Önemli not: Bir Pandas Serisini listeye veya NumPy dizisine dönüştürmek genellikle gereksizdir ve neredeyse kesinlikle OP'nin durumundadır.
AMC

1
Ayrıca, bu kadar önemsiz bir soru için aşırı uzun cevapları okumaya gerek yoktur. df.to_numpy().tolist()çoğu kullanım durumunda iyi olmalıdır.
AMC

1
Basitçe kullanarak tahminlist(x)
Pe Dro

Yanıtlar:


496

Pandalar DataFrame sütunları, onları çıkardığınızda x.tolist()bir Python listesine dönüştürmek için çağırabileceğiniz Pandas Serisidir . Alternatif olarak ile birlikte list(x).

import pandas as pd

data_dict = {'one': pd.Series([1, 2, 3], index=['a', 'b', 'c']),
             'two': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}

df = pd.DataFrame(data_dict)

print(f"DataFrame:\n{df}\n")
print(f"column types:\n{df.dtypes}")

col_one_list = df['one'].tolist()

col_one_arr = df['one'].to_numpy()

print(f"\ncol_one_list:\n{col_one_list}\ntype:{type(col_one_list)}")
print(f"\ncol_one_arr:\n{col_one_arr}\ntype:{type(col_one_arr)}")

Çıktı:

DataFrame:
   one  two
a  1.0    1
b  2.0    2
c  3.0    3
d  NaN    4

column types:
one    float64
two      int64
dtype: object

col_one_list:
[1.0, 2.0, 3.0, nan]
type:<class 'list'>

col_one_arr:
[ 1.  2.  3. nan]
type:<class 'numpy.ndarray'>

24
Kafamı dokümanların stilinin etrafında bulamıyorum, çünkü neredeyse her zaman düz sözdizimi, sözdizimi ve örneğe ihtiyacım olduğu yerde. Sözdizimi bir set oluşturmak olacaktır: set anahtar sözcüğünü ve bir listeyi kullanın: Eşlik eden örnek: alist = df.cluster.tolist (). Pandalar bu şekilde yazılıncaya kadar mücadele edeceğim. oraya varıyor, şimdi bazı örnekler var, ama her yöntem için değil.
yoshiserry

Teşekkürler @ Ben, harika Cevap! Bana Dataframe yönteminden bahsedebilir misin, daha önce hiç görmedim ki ... df = Veri Çerçevesi (d)?
yoshiserry

Bir veri çerçevesi oluşturmanın varsayılan yollarından biri, ona eşleşen anahtarlara sahip sözlüklerin bir listesini iletmektir.
Ben

2
@yoshiserry artık ortak işlevlerin çoğunun belgelerinde sözdizimi ve bağımsız değişken listesinin altında örnek kullanımı vardır. Daha başlangıç ​​seviyesi örnekleri için pandalara 15 dakika da bakabilirsiniz.
cs95

2
@Ben hala SO üzerinde aktif olduğunu görmemiştim, bu cevaba terbiyeli boyutlu bir düzenleme gönderdiğimden bahsetmek istedim, bu yüzden ne düşündüğünü bana bildir :)
AMC

54

Bu bir numpy dizisi döndürür:

arr = df["cluster"].to_numpy()

Bu, benzersiz değerlerin sayısal bir dizisini döndürür :

unique_arr = df["cluster"].unique()

İki yöntem arasında farklılıklar olsa da, benzersiz değerleri elde etmek için numpy'yi de kullanabilirsiniz:

arr = df["cluster"].to_numpy()
unique_arr = np.unique(arr)

4

Örnek dönüşüm:

Numpy Array -> Panda Veri Çerçevesi -> Bir Panda Sütunundan Liste

Numpy Dizisi

data = np.array([[10,20,30], [20,30,60], [30,60,90]])

Numpy dizisini Panda veri çerçevesine dönüştür

dataPd = pd.DataFrame(data = data)

print(dataPd)
0   1   2
0  10  20  30
1  20  30  60
2  30  60  90

Bir Panda Çerçevesini listeye dönüştür

pdToList = list(dataPd['2'])


1
Neden dizi oluşturma kodunu, çözümün önemli bir parçasıymış gibi iki kez göstermeliyim? Neden bu diziyi bile yaratıyorsunuz? df = pd.DataFrame(data=[[10, 20, 30], [20, 30, 60], [30, 60, 90]])Daha kolay değil mi? Ayrıca, Python stil kurallarına uyan değişken adını ve boşluğunu not edin. Listeyi kanıt olarak yineleyin Bu tam olarak ne kanıtlıyor? Bu bir liste mi?
AMC

2

Bu soru çok dikkat çektiğinden ve görevinizi yerine getirmenin birkaç yolu olduğundan, birkaç seçenek sunayım.

Bu arada hepsi tek gömlekli;)

İle başlayan:

df
  cluster load_date budget actual fixed_price
0       A  1/1/2014   1000   4000           Y
1       A  2/1/2014  12000  10000           Y
2       A  3/1/2014  36000   2000           Y
3       B  4/1/2014  15000  10000           N
4       B  4/1/2014  12000  11500           N
5       B  4/1/2014  90000  11000           N
6       C  7/1/2014  22000  18000           N
7       C  8/1/2014  30000  28960           N
8       C  9/1/2014  53000  51200           N

Potansiyel operasyonlara genel bakış:

ser_aggCol (collapse each column to a list)
cluster          [A, A, A, B, B, B, C, C, C]
load_date      [1/1/2014, 2/1/2014, 3/1/2...
budget         [1000, 12000, 36000, 15000...
actual         [4000, 10000, 2000, 10000,...
fixed_price      [Y, Y, Y, N, N, N, N, N, N]
dtype: object


ser_aggRows (collapse each row to a list)
0     [A, 1/1/2014, 1000, 4000, Y]
1    [A, 2/1/2014, 12000, 10000...
2    [A, 3/1/2014, 36000, 2000, Y]
3    [B, 4/1/2014, 15000, 10000...
4    [B, 4/1/2014, 12000, 11500...
5    [B, 4/1/2014, 90000, 11000...
6    [C, 7/1/2014, 22000, 18000...
7    [C, 8/1/2014, 30000, 28960...
8    [C, 9/1/2014, 53000, 51200...
dtype: object


df_gr (here you get lists for each cluster)
                             load_date                 budget                 actual fixed_price
cluster                                                                                         
A        [1/1/2014, 2/1/2014, 3/1/2...   [1000, 12000, 36000]    [4000, 10000, 2000]   [Y, Y, Y]
B        [4/1/2014, 4/1/2014, 4/1/2...  [15000, 12000, 90000]  [10000, 11500, 11000]   [N, N, N]
C        [7/1/2014, 8/1/2014, 9/1/2...  [22000, 30000, 53000]  [18000, 28960, 51200]   [N, N, N]


a list of separate dataframes for each cluster

df for cluster A
  cluster load_date budget actual fixed_price
0       A  1/1/2014   1000   4000           Y
1       A  2/1/2014  12000  10000           Y
2       A  3/1/2014  36000   2000           Y

df for cluster B
  cluster load_date budget actual fixed_price
3       B  4/1/2014  15000  10000           N
4       B  4/1/2014  12000  11500           N
5       B  4/1/2014  90000  11000           N

df for cluster C
  cluster load_date budget actual fixed_price
6       C  7/1/2014  22000  18000           N
7       C  8/1/2014  30000  28960           N
8       C  9/1/2014  53000  51200           N

just the values of column load_date
0    1/1/2014
1    2/1/2014
2    3/1/2014
3    4/1/2014
4    4/1/2014
5    4/1/2014
6    7/1/2014
7    8/1/2014
8    9/1/2014
Name: load_date, dtype: object


just the values of column number 2
0     1000
1    12000
2    36000
3    15000
4    12000
5    90000
6    22000
7    30000
8    53000
Name: budget, dtype: object


just the values of row number 7
cluster               C
load_date      8/1/2014
budget            30000
actual            28960
fixed_price           N
Name: 7, dtype: object


============================== JUST FOR COMPLETENESS ==============================


you can convert a series to a list
['C', '8/1/2014', '30000', '28960', 'N']
<class 'list'>


you can convert a dataframe to a nested list
[['A', '1/1/2014', '1000', '4000', 'Y'], ['A', '2/1/2014', '12000', '10000', 'Y'], ['A', '3/1/2014', '36000', '2000', 'Y'], ['B', '4/1/2014', '15000', '10000', 'N'], ['B', '4/1/2014', '12000', '11500', 'N'], ['B', '4/1/2014', '90000', '11000', 'N'], ['C', '7/1/2014', '22000', '18000', 'N'], ['C', '8/1/2014', '30000', '28960', 'N'], ['C', '9/1/2014', '53000', '51200', 'N']]
<class 'list'>

the content of a dataframe can be accessed as a numpy.ndarray
[['A' '1/1/2014' '1000' '4000' 'Y']
 ['A' '2/1/2014' '12000' '10000' 'Y']
 ['A' '3/1/2014' '36000' '2000' 'Y']
 ['B' '4/1/2014' '15000' '10000' 'N']
 ['B' '4/1/2014' '12000' '11500' 'N']
 ['B' '4/1/2014' '90000' '11000' 'N']
 ['C' '7/1/2014' '22000' '18000' 'N']
 ['C' '8/1/2014' '30000' '28960' 'N']
 ['C' '9/1/2014' '53000' '51200' 'N']]
<class 'numpy.ndarray'>

kod:

# prefix ser refers to pd.Series object
# prefix df refers to pd.DataFrame object
# prefix lst refers to list object

import pandas as pd
import numpy as np

df=pd.DataFrame([
        ['A',   '1/1/2014',    '1000',    '4000',    'Y'],
        ['A',   '2/1/2014',    '12000',   '10000',   'Y'],
        ['A',   '3/1/2014',    '36000',   '2000',    'Y'],
        ['B',   '4/1/2014',    '15000',   '10000',   'N'],
        ['B',   '4/1/2014',    '12000',   '11500',   'N'],
        ['B',   '4/1/2014',    '90000',   '11000',   'N'],
        ['C',   '7/1/2014',    '22000',   '18000',   'N'],
        ['C',   '8/1/2014',    '30000',   '28960',   'N'],
        ['C',   '9/1/2014',    '53000',   '51200',   'N']
        ], columns=['cluster', 'load_date',   'budget',  'actual',  'fixed_price'])
print('df',df, sep='\n', end='\n\n')

ser_aggCol=df.aggregate(lambda x: [x.tolist()], axis=0).map(lambda x:x[0])
print('ser_aggCol (collapse each column to a list)',ser_aggCol, sep='\n', end='\n\n\n')

ser_aggRows=pd.Series(df.values.tolist()) 
print('ser_aggRows (collapse each row to a list)',ser_aggRows, sep='\n', end='\n\n\n')

df_gr=df.groupby('cluster').agg(lambda x: list(x))
print('df_gr (here you get lists for each cluster)',df_gr, sep='\n', end='\n\n\n')

lst_dfFiltGr=[ df.loc[df['cluster']==val,:] for val in df['cluster'].unique() ]
print('a list of separate dataframes for each cluster', sep='\n', end='\n\n')
for dfTmp in lst_dfFiltGr:
    print('df for cluster '+str(dfTmp.loc[dfTmp.index[0],'cluster']),dfTmp, sep='\n', end='\n\n')

ser_singleColLD=df.loc[:,'load_date']
print('just the values of column load_date',ser_singleColLD, sep='\n', end='\n\n\n')

ser_singleCol2=df.iloc[:,2]
print('just the values of column number 2',ser_singleCol2, sep='\n', end='\n\n\n')

ser_singleRow7=df.iloc[7,:]
print('just the values of row number 7',ser_singleRow7, sep='\n', end='\n\n\n')

print('='*30+' JUST FOR COMPLETENESS '+'='*30, end='\n\n\n')

lst_fromSer=ser_singleRow7.tolist()
print('you can convert a series to a list',lst_fromSer, type(lst_fromSer), sep='\n', end='\n\n\n')

lst_fromDf=df.values.tolist()
print('you can convert a dataframe to a nested list',lst_fromDf, type(lst_fromDf), sep='\n', end='\n\n')

arr_fromDf=df.values
print('the content of a dataframe can be accessed as a numpy.ndarray',arr_fromDf, type(arr_fromDf), sep='\n', end='\n\n')

tarafından sivri dışarı olarak cs95 diğer yöntemler tercih edilmelidir pandalar .valuespandalar sürümü 0,24 itibaren özniteliği burada bkz . Burada kullanıyorum, çünkü çoğu insan (2019'a kadar) yeni önerileri desteklemeyen daha eski bir sürüme sahip olacak. Sürümünüzü şuradan kontrol edebilirsiniz:print(pd.__version__)


1

Sütununuz yalnızca bir değere sahip olacaksa, böyle bir şey pd.series.tolist()hata üretecektir. Tüm durumlarda çalışacağından emin olmak için aşağıdaki kodu kullanın:

(
    df
        .filter(['column_name'])
        .values
        .reshape(1, -1)
        .ravel()
        .tolist()
)

-1

Excel sayfasını okuduktan sonra veri çerçevesinin adının olduğu varsayılarak, dfboş bir liste alın (örn. dataList), Veri çerçevesi boyunca satır satır yineleyin ve boş listenize ekleyin.

dataList = [] #empty list
for index, row in df.iterrows(): 
    mylist = [row.cluster, row.load_date, row.budget, row.actual, row.fixed_price]
    dataList.append(mylist)

Veya,

dataList = [] #empty list
for row in df.itertuples(): 
    mylist = [row.cluster, row.load_date, row.budget, row.actual, row.fixed_price]
    dataList.append(mylist)

Hayır, yazdırırsanız, dataListher satırı bir liste halinde alırsınız dataList.


Değişken ve işlev adları lower_case_with_underscoresstili izlemelidir . Bu çözümün mevcut çözümlere göre tam olarak ne avantajı var? Ayrıca, Series ve DataFrames'da öznitelik stili erişimin kullanımını kesinlikle önermiyorum.
AMC

-1
 amount = list()
    for col in df.columns:
        val = list(df[col])
        for v in val:
            amount.append(v)
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.