lấy danh sách từ cột dataframe


288

Tôi có một tài liệu excel trông như thế này ..

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

Tôi muốn có thể trả về nội dung của cột 1 - cụm dưới dạng danh sách, vì vậy tôi có thể chạy một vòng lặp for trên nó và tạo một bảng tính excel cho mỗi cụm.

Cũng có thể, để trả lại nội dung của cả một hàng vào danh sách? ví dụ

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

9
Các cột khung dữ liệu của gấu trúc là một chuỗi gấu trúc khi bạn kéo chúng ra, sau đó bạn có thể gọi .tolist()để biến chúng thành một danh sách trăn
Ben

4
Từ v0.24 trở đi, .valuessẽ KHÔNG CÒN LÀ phương pháp ưa thích để truy cập các mảng numpy cơ bản. Xem câu trả lời này .
cs95

Lưu ý quan trọng: Chuyển đổi một chuỗi Pandas thành danh sách hoặc mảng NumPy thường không cần thiết và gần như chắc chắn là trong trường hợp của OP.
AMC

Ngoài ra, không cần phải đọc các câu trả lời quá dài cho một câu hỏi tầm thường như vậy. df.to_numpy().tolist()nên tốt cho hầu hết các trường hợp sử dụng.
AMC

Đơn giản chỉ cần sử dụng typecastlist(x)
Pe Dro

Câu trả lời:


494

Các cột Pandas DataFrame là Chuỗi Pandas khi bạn kéo chúng ra, sau đó bạn có thể gọi x.tolist()để biến chúng thành một danh sách Python. Hoặc bạn đúc nó với 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)}")

Đầu ra:

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_two_arr:
[ 1.  2.  3. nan]
type:<class 'numpy.ndarray'>

24
Tôi không thể hiểu được phong cách của các tài liệu, bởi vì nó hầu như luôn luôn là cú pháp thẳng, khi tôi cần cú pháp và ví dụ. Ví dụ: Cú pháp sẽ tạo một tập hợp: sử dụng từ khóa set và một danh sách: Ví dụ kèm theo: alist = df.cluster.tolist (). Cho đến khi gấu trúc được viết theo cách này tôi sẽ đấu tranh. Bây giờ nó đang ở đó, có một số ví dụ, nhưng không phải cho mọi phương pháp.
yoshiserry

Cảm ơn @Ben, câu trả lời tuyệt vời! Bạn có thể cho tôi biết về phương pháp Dataframe không, tôi chưa bao giờ thấy điều đó trước đây ... có vẻ như bạn đang chuyển đổi một đặc điểm sang một df? df = DataFrame (d)?
yoshiserry

Một trong những cách mặc định để tạo một khung dữ liệu là chuyển cho nó một danh sách các từ điển với các khóa khớp.
Ben

2
@yoshiserry hầu hết các hàm phổ biến hiện nay đều có ví dụ sử dụng trong tài liệu của họ, bên dưới danh sách cú pháp và đối số. Bạn cũng có thể xem 15 phút để gấu trúc cho các ví dụ cấp độ mới bắt đầu.
cs95

2
@Ben Tôi chưa thấy bạn vẫn hoạt động trên SO, tôi muốn đề cập rằng tôi đã gửi một bản chỉnh sửa có kích thước vừa phải cho câu trả lời này, vì vậy hãy cho tôi biết bạn nghĩ gì :)
AMC

53

Điều này trả về một mảng numpy:

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

Điều này trả về một mảng numpy của các giá trị duy nhất :

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

Bạn cũng có thể sử dụng numpy để nhận các giá trị duy nhất, mặc dù có sự khác biệt giữa hai phương thức:

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

4

Chuyển đổi ví dụ:

Numpy Array -> Khung dữ liệu Panda -> Danh sách từ một cột Panda

Mảng Numpy

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

Chuyển mảng numpy thành khung dữ liệu Panda

dataPd = pd.DataFrame(data = data)

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

Chuyển đổi một Khung Panda thành danh sách

pdToList = list(dataPd['2'])


1
Tại sao hiển thị mã tạo mảng hai lần, như thể nó là một phần quan trọng của giải pháp? Tại sao thậm chí tạo ra mảng đó, trên thực tế? Không df = pd.DataFrame(data=[[10, 20, 30], [20, 30, 60], [30, 60, 90]])đơn giản hơn sao? Ngoài ra, lưu ý tên biến và khoảng trắng theo quy ước kiểu Python. Lặp lại danh sách như một bằng chứng Điều đó chứng minh điều gì, chính xác? Đó là một danh sách?
AMC

2

Vì câu hỏi này đã thu hút được nhiều sự chú ý và có một số cách để hoàn thành nhiệm vụ của bạn, hãy để tôi trình bày một vài lựa chọn.

Bằng cách này, tất cả đều là một lớp lót;)

Bắt đầu với:

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

Tổng quan về các hoạt động tiềm năng:

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

mã:

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

như được chỉ ra bởi cs95, các phương pháp khác nên được ưu tiên hơn .valuesthuộc tính gấu trúc từ phiên bản gấu trúc 0,24 ở đây . Tôi sử dụng nó ở đây, bởi vì hầu hết mọi người sẽ (vào năm 2019) vẫn có phiên bản cũ hơn, không hỗ trợ các khuyến nghị mới. Bạn có thể kiểm tra phiên bản của bạn vớiprint(pd.__version__)


1

Nếu cột của bạn sẽ chỉ có một giá trị, một cái gì đó giống như pd.series.tolist()sẽ tạo ra lỗi. Để đảm bảo rằng nó sẽ hoạt động cho tất cả các trường hợp, sử dụng mã dưới đây:

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

-1

Giả sử tên của khung dữ liệu sau khi đọc bảng excel là df, lấy một danh sách trống (ví dụ dataList), lặp qua hàng khung dữ liệu theo hàng và nối vào danh sách trống của bạn như-

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)

Hoặc là,

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

Không, nếu bạn in dataList, bạn sẽ nhận được mỗi hàng dưới dạng một danh sách trong dataList.


Tên biến và chức năng nên theo lower_case_with_underscoresphong cách. Chính xác thì giải pháp này có lợi thế gì so với những cái hiện có? Ngoài ra, tôi thực sự không khuyến khích việc sử dụng quyền truy cập kiểu thuộc tính trên Sê-ri và DataFrames.
AMC

-1
 amount = list()
    for col in df.columns:
        val = list(df[col])
        for v in val:
            amount.append(v)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.