obtener la lista de la columna de marco de datos de pandas


289

Tengo un documento de Excel que se ve así ...

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

Quiero poder devolver el contenido de la columna 1: clúster como una lista, para poder ejecutar un bucle for sobre él y crear una hoja de cálculo de Excel para cada clúster.

¿También es posible devolver el contenido de una fila completa a una lista? p.ej

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

10
Las columnas del marco de datos de pandas son una serie de pandas cuando las extrae, a las que puede llamar .tolist()para convertirlas en una lista de Python
Ben

44
Desde la v0.24 en adelante, YA .valuesNO SERÁ el método preferido para acceder a las matrices numpy subyacentes. Mira esta respuesta .
cs95

Nota importante: la conversión de una serie de Pandas a una lista o una matriz NumPy a menudo es innecesaria, y casi seguro es en el caso de OP.
AMC

1
Además, no es necesario leer las respuestas demasiado largas para una pregunta tan trivial. df.to_numpy().tolist()debería estar bien para la mayoría de los casos de uso.
AMC

1
Simplemente escriba usandolist(x)
Pe Dro hace

Respuestas:


495

Las columnas Pandas DataFrame son series Pandas cuando las extrae, a las que puede llamar x.tolist()para convertirlas en una lista de Python. Alternativamente lo lanzas con 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)}")

Salida:

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
No puedo entender el estilo de los documentos, porque casi siempre es una sintaxis directa, donde necesito sintaxis y ejemplo. Por ejemplo, la sintaxis sería crear un conjunto: use la palabra clave set y una lista: Ejemplo de acompañamiento: alist = df.cluster.tolist (). Hasta que los pandas se escriban de esta manera, lucharé. está llegando allí, hay algunos ejemplos ahora, pero no para todos los métodos.
yoshiserry

Gracias @Ben, gran respuesta! ¿Puede contarme sobre el método Dataframe? Nunca lo había visto antes ... ¿parece que está convirtiendo un comedor a un df? df = DataFrame (d)?
yoshiserry

Una de las formas predeterminadas de crear un marco de datos es pasarle una lista de diccionarios con claves coincidentes.
Ben

2
@yoshiserry la mayoría de las funciones comunes ahora tienen ejemplos de uso en su documentación, debajo de la lista de sintaxis y argumentos. También puede ver 15 minutos para pandas para obtener más ejemplos de nivel principiante.
cs95

2
@Ben, no te había visto aún activo en SO, quería mencionar que envié una edición de tamaño decente a esta respuesta, así que déjame saber lo que piensas :)
AMC

54

Esto devuelve una matriz numpy:

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

Esto devuelve una matriz numpy de valores únicos :

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

También puede usar numpy para obtener los valores únicos, aunque existen diferencias entre los dos métodos:

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

4

Conversión de ejemplo:

Numpy Array -> Panda Data Frame -> Lista de una columna Panda

Numpy Array

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

Convierta una matriz numpy en el marco de datos Panda

dataPd = pd.DataFrame(data = data)

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

Convierte un Panda Frame a la lista

pdToList = list(dataPd['2'])


1
¿Por qué mostrar el código de creación de matriz dos veces, como si fuera una parte importante de la solución? ¿Por qué incluso crear esa matriz, de hecho? ¿No es df = pd.DataFrame(data=[[10, 20, 30], [20, 30, 60], [30, 60, 90]])más sencillo? Además, tenga en cuenta el nombre de la variable y el espacio en blanco que siguen las convenciones de estilo Python. Iterar sobre la lista como prueba ¿Qué prueba eso exactamente? ¿Que es una lista?
AMC

2

Como esta pregunta atrajo mucha atención y hay varias formas de cumplir con su tarea, permítame presentarle varias opciones.

Esos son todos una línea por cierto;)

Empezando con:

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

Resumen de operaciones potenciales:

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

código:

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

como se señala en cs95 , se deben preferir otros métodos sobre el .valuesatributo pandas de la versión 0.24 de pandas en ver aquí . Lo uso aquí, porque la mayoría de las personas (para 2019) todavía tendrán una versión anterior, que no admite las nuevas recomendaciones. Puedes consultar tu versión conprint(pd.__version__)


1

Si su columna solo tendrá un valor, algo así pd.series.tolist()producirá un error. Para garantizar que funcionará en todos los casos, use el siguiente código:

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

-1

Suponiendo que el nombre del marco de datos después de leer la hoja de Excel es df, tome una lista vacía (por ejemplo dataList), repita el marco de datos fila por fila y agregue a su lista vacía como-

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)

O,

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

No, si imprime el dataList, obtendrá cada fila como una lista en el dataList.


Los nombres de variables y funciones deben seguir el lower_case_with_underscoresestilo. ¿Qué ventaja tiene esta solución sobre las existentes, exactamente? Además, realmente desaliento el uso del acceso de estilo de atributo en Series y DataFrames.
AMC

-1
 amount = list()
    for col in df.columns:
        val = list(df[col])
        for v in val:
            amount.append(v)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.