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)?
Yoshiserry
quelle
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']}
DSM
quelle
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']
qmorgan
quelle
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
Ashish Sahu
quelle
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
Andy Hayden
quelle
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

Tanmoy
quelle
7

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

Koo
quelle
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']   
MLKing
quelle
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]

quelle
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

geekidharsh
quelle
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
itthrill
quelle
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

als ob
quelle