563 Stimmen

Hole Liste aus Pandas-Datenframe-Spalte oder -Zeile?

Ich habe ein Dataframe df aus einem Excel-Dokument importiert, 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 den Inhalt von Spalte 1 df['cluster'] als Liste zurückgeben können, damit ich eine for-Schleife darüber ausführen und ein Excel-Arbeitsblatt für jeden Cluster erstellen kann.

Ist es auch möglich, den Inhalt einer ganzen Spalte oder Reihe in eine Liste umzuwandeln? z.B.

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

6voto

Markus Dutschke Punkte 6917

Da diese Frage viel Aufmerksamkeit erhalten hat und es mehrere Möglichkeiten gibt, Ihre Aufgabe zu erfüllen, lassen Sie mich Ihnen mehrere Optionen vorstellen.

Übrigens sind dies alles Einzeiler ;)

Beginnend 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 potenzielle Operationen:

ser_aggCol (jede Spalte zu einer Liste zusammenfassen)
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 (jede Reihe zu einer Liste zusammenfassen)
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 (hier erhalten Sie Listen für jede Gruppe)
                             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]

eine Liste von separaten DataFrames für jede Gruppe

df für Gruppe 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 für Gruppe 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 für Gruppe 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

nur die Werte der Spalte 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

nur die Werte der Spalte Nummer 2
0     1000
1    12000
2    36000
3    15000
4    12000
5    90000
6    22000
7    30000
8    53000
Name: budget, dtype: object

nur die Werte der Reihe Nummer 7
cluster               C
load_date      8/1/2014
budget            30000
actual            28960
fixed_price           N
Name: 7, dtype: object

============================== NUR ZUR VOLLSTÄNDIGKEIT ==============================

Sie können eine Series in eine Liste umwandeln
['C', '8/1/2014', '30000', '28960', 'N']

Sie können ein DataFrame in eine geschachtelte Liste umwandeln
[['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']]

Der Inhalt eines DataFrames kann als numpy.ndarray abgerufen werden
[['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']]

Code:

# das Präfix ser bezieht sich auf das pd.Series-Objekt
# das Präfix df bezieht sich auf das pd.DataFrame-Objekt
# das Präfix lst bezieht sich auf List-Objekt

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 (jede Spalte zu einer Liste zusammenfassen)',ser_aggCol, sep='\n', end='\n\n\n')

ser_aggRows=pd.Series(df.values.tolist()) 
print('ser_aggRows (jede Reihe zu einer Liste zusammenfassen)',ser_aggRows, sep='\n', end='\n\n\n')

df_gr=df.groupby('cluster').agg(lambda x: list(x))
print('df_gr (hier erhalten Sie Listen für jede Gruppe)',df_gr, sep='\n', end='\n\n\n')

lst_dfFiltGr=[ df.loc[df['cluster']==val,:] for val in df['cluster'].unique() ]
print('eine Liste von separaten DataFrames für jede Gruppe', sep='\n', end='\n\n')
for dfTmp in lst_dfFiltGr:
    print('df für Gruppe '+str(dfTmp.loc[dfTmp.index[0],'cluster']),dfTmp, sep='\n', end='\n\n')

ser_singleColLD=df.loc[:,'load_date']
print('nur die Werte der Spalte load_date',ser_singleColLD, sep='\n', end='\n\n\n')

ser_singleCol2=df.iloc[:,2]
print('nur die Werte der Spalte Nummer 2',ser_singleCol2, sep='\n', end='\n\n\n')

ser_singleRow7=df.iloc[7,:]
print('nur die Werte der Reihe Nummer 7',ser_singleRow7, sep='\n', end='\n\n\n')

print('='*30+' NUR ZUR VOLLSTÄNDIGKEIT '+'='*30, end='\n\n\n')

lst_fromSer=ser_singleRow7.tolist()
print('Sie können eine Series in eine Liste umwandeln',lst_fromSer, type(lst_fromSer), sep='\n', end='\n\n\n')

lst_fromDf=df.values.tolist()
print('Sie können ein DataFrame in eine geschachtelte Liste umwandeln',lst_fromDf, type(lst_fromDf), sep='\n', end='\n\n')

arr_fromDf=df.values
print('Der Inhalt eines DataFrames kann als numpy.ndarray abgerufen werden',arr_fromDf, type(arr_fromDf), sep='\n', end='\n\n')

Wie von cs95 erwähnt, sollten ab pandas Version 0.24 andere Methoden über dem pandas .values-Attribut bevorzugt werden. Siehe hier. Ich verwende es hier, weil die meisten Menschen (bis 2019) immer noch eine ältere Version haben, die die neuen Empfehlungen nicht unterstützt. Sie können Ihre Version mit print(pd.__version__) überprüfen.

4voto

Ramin Melikov Punkte 937

Wenn Ihre Spalte nur einen Wert hat, wie zum Beispiel pd.series.tolist(), wird ein Fehler aufgetreten. Um sicherzustellen, dass es für alle Fälle funktioniert, verwenden Sie den folgenden Code:

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

1voto

Coddy Punkte 467

Wenn Sie df.T.values.tolist() eingeben, wird eine Liste von Listen von Spaltenwerten generiert.

0voto

Natasha Punkte 6203

Angenommen, der Name des Dataframes nach dem Lesen des Excel-Blattes ist df, nehmen Sie eine leere Liste (z. B. dataList), iterieren Sie durch den Dataframe Zeile für Zeile und fügen Sie Ihrer leeren Liste hinzu wie-

dataList = [] # leere Liste
for index, row in df.iterrows(): 
    mylist = [row.cluster, row.load_date, row.budget, row.actual, row.fixed_price]
    dataList.append(mylist)

Oder,

dataList = [] # leere Liste
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 dataList drucken, erhalten Sie jede Zeile als Liste in der dataList.

0voto

Dævli Punkte 5

Wenn Sie Index anstelle von Spaltennamen verwenden möchten (z. B. in einer Schleife), können Sie Folgendes verwenden:

for i in range(len(df.columns)):
    print(df[df.columns[i]].to_list())

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X