팬더 데이터 프레임 열에서 목록 가져 오기


289

다음과 같은 Excel 문서가 있습니다.

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

1 열-클러스터의 내용을 목록으로 반환 할 수 있기를 위해 for 루프를 실행하고 모든 클러스터에 대해 Excel 워크 시트를 만들 수 있습니다.

전체 행의 내용을 목록으로 반환하는 것도 가능합니까? 예 :

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

10
팬더 데이터 프레임 열은 팬더 시리즈로,이를 뽑아 .tolist()파이썬 목록으로 만들 수 있습니다.
Ben

4
v0.24부터는 .values기본 numpy 배열에 액세스하는 데 선호되는 방법이 더 이상 없습니다. 이 답변을 참조하십시오 .
cs95

중요 사항 : Pandas Series를 목록 또는 NumPy 배열로 변환하는 것은 종종 불필요하며 거의 확실하게 OP의 경우입니다.
AMC

1
또한 그러한 사소한 질문에 대한 지나치게 긴 답변을 읽을 필요가 없습니다. df.to_numpy().tolist()대부분의 사용 사례에 적합합니다.
AMC

1
간단하게 사용 배역list(x)
PE DRO

답변:


495

Pandas DataFrame 열은 열 때 Pandas Series이며,이를 호출 x.tolist()하여 Python 목록으로 만들 수 있습니다. 또는로 캐스팅하십시오 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)}")

산출:

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
구문과 예제가 필요한 곳에서는 거의 항상 간단한 구문이기 때문에 문서 스타일에 대해 알 수 없습니다. 예를 들어 구문은 집합을 만드는 것입니다. set 키워드와 목록을 사용하십시오. 예 : alist = df.cluster.tolist (). 팬더가 이런 식으로 쓰여질 때까지 나는 싸울 것입니다. 거기에 도달하고 있습니다. 지금 몇 가지 예가 있지만 모든 방법이 아닙니다.
yoshiserry

감사합니다 @Ben, 훌륭한 답변! Dataframe 방법에 대해 말해 줄 수 있습니까? 전에는 본 적이 없습니다 ... 사전을 df로 변환하는 것처럼 보입니다. df = DataFrame (d)?
yoshiserry

데이터 프레임을 만드는 기본 방법 중 하나는 일치하는 키가있는 사전 목록을 전달하는 것입니다.
Ben

2
@yoshiserry 대부분의 공통 함수는 구문 및 인수 목록 아래 문서에서 예제 사용법을 갖습니다. 초보자 수준의 예제를 보려면 팬더에게 15 분을 볼 수도 있습니다.
cs95

2
@ 벤 나는 :) 그래서 나를 어떻게 생각하는지 보자, 나는이 답변에 상당히 크기의 편집을 제출 언급하고 싶어, 당신은 SO에 여전히 활성화되어 보지 못한
AMC

54

numpy 배열을 반환합니다.

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

고유 한 값으로 구성된 numpy 배열을 반환 합니다.

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

두 방법간에 차이점이 있지만 numpy를 사용하여 고유 한 값을 얻을 수도 있습니다.

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

4

변환 예 :

Numpy Array-> 팬더 데이터 프레임-> 하나의 팬더 열에서 목록

너피 어레이

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

numpy 배열을 Panda 데이터 프레임으로 변환

dataPd = pd.DataFrame(data = data)

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

하나의 팬더 프레임을 목록으로 변환

pdToList = list(dataPd['2'])


1
왜 솔루션의 중요한 부분 인 것처럼 어레이 생성 코드를 두 번 표시합니까? 실제로 해당 배열을 생성하는 이유는 무엇입니까? df = pd.DataFrame(data=[[10, 20, 30], [20, 30, 60], [30, 60, 90]])더 간단 하지 않습니까? 또한 파이썬 스타일 규칙을 따르는 변수 이름과 공백을 참고하십시오. 증거로 목록을 반복하십시오 . 정확히 무엇을 증명합니까? 그게 목록인가요?
AMC

2

이 질문에 많은 관심을 기울이고 작업을 수행하는 몇 가지 방법이 있으므로 몇 가지 옵션을 제시하겠습니다.

그건 그렇고 그들은 모두 하나의 라이너입니다.)

로 시작:

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

잠재적 운영 개요 :

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

암호:

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

cs95 에서 지적했듯이 여기.values 에서 팬더 버전 0.24의 팬더 속성 보다 다른 방법을 선호해야합니다 . 대부분의 사람들은 (2019 년까지) 여전히 새로운 버전을 지원하지 않는 이전 버전을 가지고 있기 때문에 여기에서 사용합니다. 당신은 당신의 버전을 확인할 수 있습니다print(pd.__version__)


1

열에 하나의 값만 있으면 pd.series.tolist()오류가 발생합니다. 모든 경우에 작동하도록하려면 아래 코드를 사용하십시오.

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

-1

엑셀 시트를 읽은 후 데이터 프레임의 이름이 다음과 같다고 가정하면 df빈 목록 (예 dataList:)을 가져 와서 데이터 프레임을 행 단위로 반복하고 빈 목록에 다음과 같이 추가하십시오.

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)

또는,

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

아니요,를 인쇄하면 dataList각 행이의 목록으로 표시됩니다 dataList.


변수 및 함수 이름은 lower_case_with_underscores스타일을 따라야합니다 . 이 솔루션은 기존 솔루션보다 어떤 이점이 있습니까? 또한 Series 및 DataFrames에서 특성 스타일 액세스를 사용하지 않는 것이 좋습니다.
AMC

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.