web-dev-qa-db-de.com

liste der Pandas-Dataframe-Spalten nach Datentyp abrufen

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, die vom Typ Object oder vom Typ DateTime sind.

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

Könnte sein:

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

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

>>> 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']}
269
DSM

Ab Pandas v0.14.1 können Sie select_dtypes() verwenden, um Spalten nach dtype auszuwä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']
82
qmorgan

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 wieder 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
23
Andy Hayden

Mit dtype erhalten Sie den gewünschten Datentyp der Spalte:

dataframe['column1'].dtype

wenn Sie die Datentypen aller Spalten gleichzeitig kennen lernen möchten, können Sie einen Plural von dtype als dtypes verwenden:

dataframe.dtypes
18
Ashish Sahu

verwenden Sie df.info(), wobei df ein Pandas-Datenrahmen ist

6
Koo
df.select_dtypes(['object'])

Das sollte den Trick tun

4
Tanmoy

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

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

Zum Beispiel:

>>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 'object' dtype-Spalten 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']   
2
MLKing

Wenn Sie nur eine Liste der Objektspalten anzeigen möchten, 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 weitere Liste nur der Numerik erhalten möchten:

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

Ich benutze infer_objects ()

Dokumentzeichenfolge: Es wird versucht, bessere Datentypen für Objektspalten abzuleiten.

Versucht, Spalten mit Objekt-D-Typ sanft zu konvertieren, wobei nicht-Objekt- und nicht-konvertierbare Spalten unverändert bleiben. Die Inferenzregeln sind dieselben wie bei der normalen Serien-/DataFrame-Konstruktion.

df.infer_objects().dtypes

0
as - if

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
itthrill

Ich habe mir dieses Dreibettzimmer ausgedacht

Im Wesentlichen ist dies, was es tut: 

  1. Rufen Sie die Spaltennamen und ihre jeweiligen Datentypen ab.
  2. Ich gebe es optional in 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 machte mein Leben viel einfacher, als ich versuchte, Schemas erzeugen on the fly zu erstellen. Hoffe das hilft

0
geekidharsh