Liste aus der Pandas-Datenrahmenspalte abrufen

288

Ich habe ein Excel-Dokument, das so aussieht.

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

Ich möchte in der Lage sein, den Inhalt von Spalte 1 - Cluster als Liste zurückzugeben, damit ich eine for-Schleife darüber ausführen und für jeden Cluster ein Excel-Arbeitsblatt erstellen kann.

Ist es auch möglich, den Inhalt einer ganzen Zeile in eine Liste zurückzugeben? z.B

list = [], list[column1] or list[df.ix(row1)]
Yoshiserry
quelle
9
Pandas Dataframe-Spalten sind eine Pandas-Serie, wenn Sie sie herausziehen, die Sie dann aufrufen können .tolist(), um sie in eine Python-Liste umzuwandeln
Ben
4
Ab Version 0.24 ist .valuesNO LONGER die bevorzugte Methode für den Zugriff auf zugrunde liegende Numpy-Arrays. Siehe diese Antwort .
CS95
Wichtiger Hinweis: Das Konvertieren einer Pandas-Serie in eine Liste oder ein NumPy-Array ist häufig nicht erforderlich, und dies ist mit ziemlicher Sicherheit bei OP der Fall.
AMC
Es ist auch nicht nötig, die zu langen Antworten für eine so triviale Frage zu lesen. df.to_numpy().tolist()sollte für die meisten Anwendungsfälle in Ordnung sein.
AMC
Einfach typisieren mitlist(x)
Pe Dro vor

Antworten:

494

Pandas DataFrame-Spalten sind Pandas-Serien, wenn Sie sie herausziehen. Sie können sie dann aufrufen x.tolist(), um sie in eine Python-Liste umzuwandeln . Alternativ wirfst du es mit 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)}")

Ausgabe:

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'>
Ben
quelle
24
Ich kann mich nicht mit dem Stil der Dokumente auseinandersetzen, da es fast immer eine reine Syntax ist, bei der ich Syntax und Beispiel benötige. Eine Syntax wäre beispielsweise, eine Menge zu erstellen: Verwenden Sie das Schlüsselwort set und eine Liste: Begleitendes Beispiel: alist = df.cluster.tolist (). Bis Pandas so geschrieben sind, werde ich kämpfen. Es gibt einige Beispiele, aber nicht für jede Methode.
Yoshiserry
Danke @Ben, tolle Antwort! Können Sie mir etwas über die Dataframe-Methode erzählen? Ich habe das noch nie gesehen. Es scheint, als würden Sie einen Dinctionary in einen df konvertieren. df = Datenrahmen (d)?
Yoshiserry
Eine der Standardmethoden zum Erstellen eines Datenrahmens besteht darin, ihm eine Liste von Wörterbüchern mit übereinstimmenden Schlüsseln zu übergeben.
Ben
2
@yoshiserry Die meisten gängigen Funktionen werden jetzt in ihrer Dokumentation unter der Syntax- und Argumentliste als Beispiel verwendet. Sie können auch 15 Minuten für Pandas sehen, um weitere Beispiele für Anfänger zu finden.
CS95
2
@Ben Ich hatte nicht gesehen, dass du noch auf SO aktiv bist. Ich wollte erwähnen, dass ich diese Antwort in angemessener Größe bearbeitet habe. Lass mich wissen, was du denkst :)
AMC
53

Dies gibt ein numpy Array zurück:

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

Dies gibt ein numpy-Array eindeutiger Werte zurück:

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

Sie können auch numpy verwenden, um die eindeutigen Werte abzurufen, obwohl es Unterschiede zwischen den beiden Methoden gibt:

arr = df["cluster"].to_numpy()
unique_arr = np.unique(arr)
Anirudh Bandi
quelle
4

Beispielkonvertierung:

Numpy Array -> Panda-Datenrahmen -> Liste aus einer Panda-Spalte

Numpy Array

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

Konvertieren Sie das Numpy-Array in einen Panda-Datenrahmen

dataPd = pd.DataFrame(data = data)

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

Konvertiere einen Panda-Frame in eine Liste

pdToList = list(dataPd['2'])

Harvey
quelle
1
Warum sollte der Array-Erstellungscode zweimal angezeigt werden, als wäre er ein wichtiger Teil der Lösung? Warum überhaupt dieses Array erstellen? Ist das nicht df = pd.DataFrame(data=[[10, 20, 30], [20, 30, 60], [30, 60, 90]])einfacher? Beachten Sie auch den Variablennamen und das Leerzeichen, die den Python-Konventionen entsprechen. Als Beweis über die Liste iterieren Was beweist das genau? Dass es eine Liste ist?
AMC
2

Da diese Frage viel Aufmerksamkeit auf sich gezogen hat und es verschiedene Möglichkeiten gibt, Ihre Aufgabe zu erfüllen, möchte ich einige Optionen vorstellen.

Das sind übrigens alles Einzeiler;)

Beginnen mit:

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

Übersicht über mögliche Operationen:

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

Wie in cs95 hervorgehoben , sollten andere Methoden gegenüber dem Pandas- .valuesAttribut aus der Pandas-Version 0.24 bevorzugt werden ( siehe hier) . Ich benutze es hier, weil die meisten Leute (bis 2019) noch eine ältere Version haben werden, die die neuen Empfehlungen nicht unterstützt. Sie können Ihre Version mit überprüfenprint(pd.__version__)

Markus Dutschke
quelle
1

Wenn Ihre Spalte nur einen Wert hat, wird so etwas wie pd.series.tolist()ein Fehler erzeugt. Verwenden Sie den folgenden Code, um sicherzustellen, dass es in allen Fällen funktioniert:

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

Angenommen, der Name des Datenrahmens nach dem Lesen der Excel-Tabelle lautet df: Nehmen Sie eine leere Liste (z. B. dataList), durchlaufen Sie den Datenrahmen zeilenweise und fügen Sie ihn wie folgt an Ihre leere Liste an.

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)

Oder,

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

Nein, wenn Sie die drucken dataList, erhalten Sie jede Zeile als Liste in der dataList.

Natascha
quelle
Variablen- und Funktionsnamen sollten dem lower_case_with_underscoresStil folgen . Welchen Vorteil hat diese Lösung genau gegenüber den bestehenden? Außerdem rate ich dringend von der Verwendung des Attributzugriffs auf Serien und DataFrames ab.
AMC
-1
 amount = list()
    for col in df.columns:
        val = list(df[col])
        for v in val:
            amount.append(v)
Kamran Kausar
quelle