dapatkan daftar dari kolom dataframe panda


289

Saya memiliki dokumen excel yang terlihat seperti ini ..

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

Saya ingin dapat mengembalikan konten kolom 1 - cluster sebagai daftar, jadi saya bisa menjalankan loop for di atasnya, dan membuat lembar kerja excel untuk setiap cluster.

Apakah mungkin, untuk mengembalikan konten seluruh baris ke daftar? misalnya

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

10
Kolom dataframe panda adalah seri panda saat Anda menariknya keluar, yang kemudian dapat Anda panggil .tolist()untuk mengubahnya menjadi daftar python
Ben

4
Dari v0.24 dan seterusnya, .valuesTIDAK ADA PANJANG menjadi metode yang disukai untuk mengakses array numpy yang mendasarinya. Lihat jawaban ini .
cs95

Catatan penting: Mengubah Seri Pandas ke daftar atau array NumPy seringkali tidak perlu, dan hampir pasti dalam kasus OP.
AMC

1
Juga, tidak perlu membaca jawaban yang terlalu panjang untuk pertanyaan sepele seperti itu. df.to_numpy().tolist()harus baik untuk sebagian besar kasus penggunaan.
AMC

1
Cukup typecast menggunakanlist(x)
Pe Dro

Jawaban:


497

Kolom DataFrame Pandas adalah Seri Pandas saat Anda menariknya, yang kemudian dapat Anda panggil x.tolist()untuk mengubahnya menjadi daftar Python. Atau Anda melemparkannya 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)}")

Keluaran:

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
Saya tidak dapat memahami gaya dokumen, karena hampir selalu berupa sintaks langsung, di mana saya membutuhkan sintaks dan contoh. Misalnya Sintaks akan membuat set: gunakan kata kunci set, dan daftar: Contoh pendamping: alist = df.cluster.tolist (). Sampai panda ditulis dengan cara ini aku akan berjuang. sudah sampai di sana, ada beberapa contoh sekarang, tetapi tidak untuk setiap metode.
yoshiserry

Terima kasih @ Ben, Jawaban yang bagus! Bisakah Anda ceritakan tentang metode Dataframe, saya belum pernah melihat itu sebelumnya ... sepertinya Anda mengonversi dinctionary ke df? df = DataFrame (d)?
yoshiserry

Salah satu cara default untuk membuat kerangka data adalah dengan memberikannya daftar kamus dengan kunci yang cocok.
Ben

2
@yoshiserry sebagian besar fungsi umum sekarang memiliki contoh penggunaan dalam dokumentasinya, di bawah sintaksis dan daftar argumen. Anda juga dapat melihat 15 menit ke panda untuk contoh tingkat pemula lainnya.
cs95

2
@Ben Saya belum melihat Anda masih aktif di SO, saya ingin menyebutkan bahwa saya mengirimkan suntingan berukuran layak untuk jawaban ini, jadi biarkan saya tahu apa yang Anda pikirkan :)
AMC

54

Ini mengembalikan array numpy:

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

Ini mengembalikan array nilai unik yang numpy :

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

Anda juga bisa menggunakan numpy untuk mendapatkan nilai unik, meskipun ada perbedaan antara kedua metode:

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

4

Contoh konversi:

Numpy Array -> Panda Data Frame -> Daftar dari satu Kolom Panda

Array Numpy

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

Ubah array numpy menjadi bingkai data Panda

dataPd = pd.DataFrame(data = data)

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

Konversi satu Bingkai Panda ke daftar

pdToList = list(dataPd['2'])


1
Mengapa menunjukkan kode pembuatan array dua kali, seolah-olah itu adalah bagian penting dari solusi? Bahkan mengapa membuat array itu sama sekali? Bukankah df = pd.DataFrame(data=[[10, 20, 30], [20, 30, 60], [30, 60, 90]])lebih mudah? Juga, perhatikan nama variabel dan spasi putih yang mengikuti konvensi gaya Python. Iterate over list sebagai bukti Apa yang membuktikannya, tepatnya? Itu daftar?
AMC

2

Karena pertanyaan ini mendapatkan banyak perhatian dan ada beberapa cara untuk memenuhi tugas Anda, izinkan saya menyajikan beberapa opsi.

Semua itu hanya satu kalimat;)

Dimulai dengan:

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

Tinjauan potensi operasi:

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'>

kode:

# 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')

seperti yang ditunjukkan oleh cs95 metode lain harus lebih disukai daripada .valuesatribut panda dari panda versi 0.24 pada lihat di sini . Saya menggunakannya di sini, karena kebanyakan orang akan (pada 2019) masih memiliki versi yang lebih lama, yang tidak mendukung rekomendasi baru. Anda dapat memeriksa versi Anda denganprint(pd.__version__)


1

Jika kolom Anda hanya memiliki satu nilai, sesuatu seperti pd.series.tolist()akan menghasilkan kesalahan. Untuk menjamin itu akan bekerja untuk semua kasus, gunakan kode di bawah ini:

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

-1

Dengan asumsi nama kerangka data setelah membaca lembar excel adalah df, ambil daftar kosong (misalnya dataList), beralih melalui baris data baris demi baris dan tambahkan ke daftar kosong Anda seperti-

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)

Atau,

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

Tidak, jika Anda mencetak dataList, Anda akan mendapatkan setiap baris sebagai daftar di dataList.


Nama variabel dan fungsi harus mengikuti lower_case_with_underscoresgaya. Apa kelebihan yang dimiliki solusi ini dibandingkan yang ada, tepatnya? Juga, saya benar-benar mencegah penggunaan akses atribut-style pada Series dan DataFrames.
AMC

-1
 amount = list()
    for col in df.columns:
        val = list(df[col])
        for v in val:
            amount.append(v)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.