Liste der Pandas-Datenrahmenspalten basierend auf dem Datentyp abrufen


182

Wenn ich einen Datenrahmen mit den folgenden Spalten habe:

1. NAME                                     object
2. On_Time                                      object
3. On_Budget                                    object
4. %actual_hr                                  float64
5. Baseline Start Date                  datetime64[ns]
6. Forecast Start Date                  datetime64[ns] 

Ich möchte sagen können: Hier ist ein Datenrahmen, geben Sie mir eine Liste der Spalten vom Typ Object oder vom Typ DateTime?

Ich habe eine Funktion, die Zahlen (Float64) in zwei Dezimalstellen konvertiert, und ich möchte diese Liste von Datenrahmenspalten eines bestimmten Typs verwenden und diese Funktion ausführen, um sie alle in 2dp zu konvertieren.

Vielleicht:

For c in col_list: if c.dtype = "Something"
list[]
List.append(c)?

4
Als ich zu dieser Frage kam, suchte ich nach einer Möglichkeit, genau die Liste oben zu erstellen. df.dtypestut das.
Martin Thoma

Besucher könnten auch an dieser unterschiedlichen, aber verwandten Frage interessiert sein, wie alle Objekttypen in jeder Spalte gefunden werden können : Wie kann ich Untertypen in Pandas-Objektspalten erkennen? .
jpp

Antworten:


313

Wenn Sie eine Liste von Spalten eines bestimmten Typs wünschen, können Sie Folgendes verwenden groupby:

>>> df = pd.DataFrame([[1, 2.3456, 'c', 'd', 78]], columns=list("ABCDE"))
>>> df
   A       B  C  D   E
0  1  2.3456  c  d  78

[1 rows x 5 columns]
>>> df.dtypes
A      int64
B    float64
C     object
D     object
E      int64
dtype: object
>>> g = df.columns.to_series().groupby(df.dtypes).groups
>>> g
{dtype('int64'): ['A', 'E'], dtype('float64'): ['B'], dtype('O'): ['C', 'D']}
>>> {k.name: v for k, v in g.items()}
{'object': ['C', 'D'], 'int64': ['A', 'E'], 'float64': ['B']}

5
Dies ist nützlich als Datenqualitätsprüfung, bei der sichergestellt wird, dass die Spalten vom erwarteten Typ sind.
NYCeyes

2
Dies funktioniert nicht, wenn alle Ihre Datenrahmenspalten objectunabhängig vom tatsächlichen Inhalt den Typ zurückgeben
user5359531

2
@ user5359531 Das bedeutet nicht, dass es nicht funktioniert. Das bedeutet, dass Ihre DataFrame-Spalten nicht in den Typ umgewandelt wurden, den Sie für richtig halten. Dies kann aus verschiedenen Gründen geschehen.
Marc

6
Wenn Sie nur Spalten nach Datentyp auswählen, ist diese Antwort veraltet. Verwenden Sie select_dtypesstattdessen
Ted Petrou

Wie indizieren Sie diesen gruppierten Datenrahmen anschließend?
Allen Wang

109

Ab pandas v0.14.1 können Sie select_dtypes()Spalten nach dtype auswählen

In [2]: df = pd.DataFrame({'NAME': list('abcdef'),
    'On_Time': [True, False] * 3,
    'On_Budget': [False, True] * 3})

In [3]: df.select_dtypes(include=['bool'])
Out[3]:
  On_Budget On_Time
0     False    True
1      True   False
2     False    True
3      True   False
4     False    True
5      True   False

In [4]: mylist = list(df.select_dtypes(include=['bool']).columns)

In [5]: mylist
Out[5]: ['On_Budget', 'On_Time']

35

Mit dtypewird der Datentyp der gewünschten Spalte angezeigt:

dataframe['column1'].dtype

Wenn Sie die Datentypen aller Spalten gleichzeitig kennen möchten , können Sie den Plural von dtypeas dtypes verwenden :

dataframe.dtypes

1
Dies sollte die akzeptierte Antwort sein, sie druckt die Datentypen in fast genau dem Format, das OP will.
Abhishek Divekar

1
Die Frage df.select_dtypes(include=['Object','DateTime']).columns
betraf die

29

Sie können eine boolesche Maske für das Attribut dtypes verwenden:

In [11]: df = pd.DataFrame([[1, 2.3456, 'c']])

In [12]: df.dtypes
Out[12]: 
0      int64
1    float64
2     object
dtype: object

In [13]: msk = df.dtypes == np.float64  # or object, etc.

In [14]: msk
Out[14]: 
0    False
1     True
2    False
dtype: bool

Sie können nur die Spalten mit dem gewünschten dtype anzeigen:

In [15]: df.loc[:, msk]
Out[15]: 
        1
0  2.3456

Jetzt können Sie round (oder was auch immer) verwenden und es zurück zuweisen:

In [16]: np.round(df.loc[:, msk], 2)
Out[16]: 
      1
0  2.35

In [17]: df.loc[:, msk] = np.round(df.loc[:, msk], 2)

In [18]: df
Out[18]: 
   0     1  2
0  1  2.35  c

Ich würde gerne in der Lage sein, eine Funktion zu schreiben, die den Namen eines Datenrahmens aufnimmt und dann ein Listenwörterbuch zurückgibt, wobei der Wörterbuchschlüssel der Datentyp und der Wert die Liste der Spalten aus dem Datenrahmen ist, die dazu gehören Datentyp.
Yoshiserry

def col_types (x, pd):
itthrill

14
list(df.select_dtypes(['object']).columns)

Dies sollte den Trick tun


7

Verwenden Sie standardmäßig " df.info(verbose=True)where dfis a pandas datafarme"verbose=False


Es kann Speicherprobleme geben, wenn die Tabelle groß ist
Koo

4

Der direkteste Weg, um eine Liste von Spalten eines bestimmten Typs zu erhalten, z. B. 'Objekt':

df.select_dtypes(include='object').columns

Beispielsweise:

>>df = pd.DataFrame([[1, 2.3456, 'c', 'd', 78]], columns=list("ABCDE"))
>>df.dtypes

A      int64
B    float64
C     object
D     object
E      int64
dtype: object

So rufen Sie alle Spalten vom Typ 'Objekt' ab:

>>df.select_dtypes(include='object').columns

Index(['C', 'D'], dtype='object')

Nur für die Liste:

>>list(df.select_dtypes(include='object').columns)

['C', 'D']   

3

Wenn Sie nur eine Liste der Objektspalten wünschen, können Sie Folgendes tun:

non_numerics = [x for x in df.columns \
                if not (df[x].dtype == np.float64 \
                        or df[x].dtype == np.int64)]

und dann, wenn Sie eine andere Liste nur der Zahlen erhalten möchten:

numerics = [x for x in df.columns if x not in non_numerics]

0

Ich habe mir diesen Drei-Liner ausgedacht .

Im Wesentlichen ist hier, was es tut:

  1. Rufen Sie die Spaltennamen und ihre jeweiligen Datentypen ab.
  2. Ich gebe es optional auf eine CSV aus.

inp = pd.read_csv('filename.csv') # read input. Add read_csv arguments as needed
columns = pd.DataFrame({'column_names': inp.columns, 'datatypes': inp.dtypes})
columns.to_csv(inp+'columns_list.csv', encoding='utf-8') # encoding is optional

Dies erleichterte mir das Leben, wenn ich versuchte, Schemata im laufenden Betrieb zu generieren . Hoffe das hilft


0

für yoshiserry;

def col_types(x,pd):
    dtypes=x.dtypes
    dtypes_col=dtypes.index
    dtypes_type=dtypes.value
    column_types=dict(zip(dtypes_col,dtypes_type))
    return column_types

0

Ich benutze infer_objects ()

Docstring: Versuchen Sie, bessere dtypes für Objektspalten abzuleiten.

Versucht eine weiche Konvertierung von Spalten vom Typ "Objekttyp", wobei nicht objektbezogene und nicht konvertierbare Spalten unverändert bleiben. Die Inferenzregeln sind dieselben wie bei der normalen Serien- / DataFrame-Konstruktion.

df.infer_objects().dtypes

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.