obtenir la liste de la colonne de trame de données pandas


289

J'ai un document Excel qui ressemble à ceci ..

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

Je veux pouvoir retourner le contenu de la colonne 1 - cluster sous forme de liste, donc je peux exécuter une boucle for dessus et créer une feuille de calcul Excel pour chaque cluster.

Est-il également possible de renvoyer le contenu d'une ligne entière dans une liste? par exemple

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

10
Les colonnes de trame de données Pandas sont une série de pandas lorsque vous les retirez, que vous pouvez ensuite appeler .tolist()pour les transformer en une liste python
Ben

4
À partir de la version 0.24, .valuesla méthode préférée pour accéder aux tableaux numpy sous-jacents NE SERA PLUS. Voir cette réponse .
cs95

Remarque importante: la conversion d'une série Pandas en liste ou en tableau NumPy est souvent inutile, et c'est certainement le cas dans OP.
AMC

1
En outre, il n'est pas nécessaire de lire les réponses trop longues pour une question aussi triviale. df.to_numpy().tolist()devrait convenir à la plupart des cas d'utilisation.
AMC

1
Simplement transtypé en utilisantlist(x)
Pe Dro

Réponses:


497

Les colonnes Pandas DataFrame sont des séries Pandas lorsque vous les retirez, que vous pouvez ensuite appeler x.tolist()pour les transformer en liste Python. Vous pouvez également le lancer avec 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)}")

Production:

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
Je ne peux pas me familiariser avec le style des documents, car c'est presque toujours une syntaxe simple, où j'ai besoin de syntaxe et d'exemple. Par exemple, la syntaxe serait de créer un ensemble: utilisez le mot-clé ensemble et une liste: Exemple d'accompagnement: alist = df.cluster.tolist (). Jusqu'à ce que les pandas soient écrits de cette façon, je lutterai. ça y arrive, il y a des exemples maintenant, mais pas pour chaque méthode.
yoshiserry

Merci @Ben, excellente réponse! Pouvez-vous me parler de la méthode Dataframe, je n'ai jamais vu ça auparavant ... semble que vous convertissez un dinctionnaire en df? df = DataFrame (d)?
yoshiserry

L'une des façons par défaut de créer une trame de données est de lui transmettre une liste de dictionnaires avec des clés correspondantes.
Ben

2
@yoshiserry la plupart des fonctions courantes ont maintenant un exemple d'utilisation dans leur documentation, sous la syntaxe et la liste des arguments. Vous pouvez également voir 15 minutes pour les pandas pour plus d'exemples de niveau débutant.
cs95

2
@Ben Je n'avais pas vu que vous étiez toujours actif sur SO, je voulais mentionner que j'ai soumis une modification de taille décente à cette réponse, alors faites-moi savoir ce que vous en pensez :)
AMC

54

Cela renvoie un tableau numpy:

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

Cela renvoie un tableau numpy de valeurs uniques :

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

Vous pouvez également utiliser numpy pour obtenir les valeurs uniques, bien qu'il existe des différences entre les deux méthodes:

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

4

Exemple de conversion:

Numpy Array -> Panda Data Frame -> Liste d'une colonne Panda

Numpy Array

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

Convertir un tableau numpy en trame de données Panda

dataPd = pd.DataFrame(data = data)

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

Convertir un cadre Panda en liste

pdToList = list(dataPd['2'])


1
Pourquoi afficher le code de création de tableau deux fois, comme s'il était un élément important de la solution? Pourquoi même créer ce tableau, en fait? N'est-ce pas df = pd.DataFrame(data=[[10, 20, 30], [20, 30, 60], [30, 60, 90]])plus simple? Notez également le nom de la variable et les espaces qui suivent les conventions de style Python. Itérer sur la liste comme preuve Qu'est-ce que cela prouve, exactement? Que c'est une liste?
AMC

2

Comme cette question a attiré beaucoup d'attention et qu'il existe plusieurs façons d'accomplir votre tâche, permettez-moi de vous présenter plusieurs options.

Ce ne sont d'ailleurs que des doublures;)

Commençant par:

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

Aperçu des opérations potentielles:

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

code:

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

comme indiqué par cs95, d' autres méthodes devraient être préférées à l' .valuesattribut pandas de la version 0.24 de pandas, voir ici . Je l'utilise ici, car la plupart des gens (d'ici 2019) auront toujours une version plus ancienne, qui ne prend pas en charge les nouvelles recommandations. Vous pouvez vérifier votre version avecprint(pd.__version__)


1

Si votre colonne n'a qu'une seule valeur, quelque chose comme pd.series.tolist()va produire une erreur. Pour garantir qu'il fonctionnera dans tous les cas, utilisez le code ci-dessous:

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

-1

En supposant que le nom de la trame de données après avoir lu la feuille Excel est df, prenez une liste vide (par exemple dataList), parcourez la trame de données ligne par ligne et ajoutez-la à votre liste vide comme-

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)

Ou,

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

Non, si vous imprimez le dataList, vous obtiendrez chaque ligne sous forme de liste dans le dataList.


Les noms de variables et de fonctions doivent suivre le lower_case_with_underscoresstyle. Quel avantage cette solution a-t-elle exactement par rapport aux solutions existantes? De plus, je décourage vraiment l'utilisation de l'accès de style attributaire sur les séries et les DataFrames.
AMC

-1
 amount = list()
    for col in df.columns:
        val = list(df[col])
        for v in val:
            amount.append(v)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.