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)?
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']}
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']
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
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
verwenden Sie df.info()
, wobei df
ein Pandas-Datenrahmen ist
df.select_dtypes(['object'])
Das sollte den Trick tun
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']
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]
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
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
Ich habe mir dieses Dreibettzimmer ausgedacht.
Im Wesentlichen ist dies, was es tut:
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