uzyskać listę kolumn ramki danych pand na podstawie typu danych

184

Jeśli mam ramkę danych z następującymi kolumnami:

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] 

Chciałbym móc powiedzieć: oto ramka danych, podaj mi listę kolumn typu Object lub typu DateTime?

Mam funkcję, która konwertuje liczby (Float64) na dwa miejsca po przecinku, i chciałbym użyć tej listy kolumn ramki danych określonego typu i uruchomić ją przez tę funkcję, aby przekonwertować je wszystkie na 2dp.

Może:

For c in col_list: if c.dtype = "Something"
list[]
List.append(c)?
yoshiserry
źródło
4
Kiedy przyszedłem do tego pytania, szukałem sposobu, aby stworzyć dokładnie listę u góry. df.dtypesrobi to.
Martin Thoma,
Odwiedzający mogą być również zainteresowani tym innym, ale pokrewnym pytaniem, jak znaleźć wszystkie typy obiektów w każdej kolumnie : Jak wykryć podtypy w kolumnach obiektów pand? .
JPP

Odpowiedzi:

314

Jeśli chcesz listę kolumn określonego typu, możesz użyć 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
źródło
5
Jest to przydatne jako kontrola jakości danych, w której sprawdza się, czy kolumny są typu, którego się oczekuje.
NYCeyes
2
to nie działa, jeśli wszystkie kolumny ramek danych zwracają objecttyp, niezależnie od ich rzeczywistej zawartości
user5359531
2
@ user5359531, co nie znaczy, że nie działa, co w rzeczywistości oznacza, że ​​kolumny DataFrame nie zostały przeniesione do typu, jaki Twoim zdaniem powinien być, co może się zdarzyć z różnych powodów.
Marc
6
Jeśli wybierasz kolumny według typu danych, ta odpowiedź jest nieaktualna. select_dtypesZamiast tego użyj
Ted Petrou,
Jak następnie zindeksować tę zgrupowaną ramkę danych?
Allen Wang
110

Począwszy od pand v0.14.1, można używać select_dtypes()do wybierania kolumn według typu dtype

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
źródło
35

Użycie dtypedaje pożądany typ danych kolumny:

dataframe['column1'].dtype

jeśli chcesz poznać typy danych wszystkich kolumn jednocześnie , możesz użyć liczby mnogiej dtypejako dtypów :

dataframe.dtypes
Ashish Sahu
źródło
1
To powinna być zaakceptowana odpowiedź, wypisuje typy danych w prawie dokładnie takim formacie, jaki chce OP.
Abhishek Divekar,
1
Pytanie dotyczyło wyszczególnienia tylko konkretnego typu danych, na przykład użycia, df.select_dtypes(include=['Object','DateTime']).columnsjak omówiono poniżej
DfAC
29

Możesz użyć maski logicznej dla atrybutu dtypes:

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

Możesz spojrzeć tylko na te kolumny z pożądanym typem:

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

Teraz możesz użyć okrągłego (lub cokolwiek) i przypisać go z powrotem:

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
źródło
Chciałbym móc napisać funkcję, która przyjmuje nazwę ramki danych, a następnie zwraca słownik list, przy czym kluczem słownika jest typ danych, a wartością jest lista kolumn z ramki danych, które są z tego typ danych.
yoshiserry
def col_types (x, pd):
itthrill
14
list(df.select_dtypes(['object']).columns)

To powinno załatwić sprawę

Tanmoy
źródło
7

domyślnie użyj df.info(verbose=True)gdzie dfjest pandas datafarmeverbose=False

Koo
źródło
jeśli stół jest duży, mogą wystąpić problemy z pamięcią
Koo
4

Najbardziej bezpośredni sposób na uzyskanie listy kolumn określonego typu, np. „Object”:

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

Na przykład:

>>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

Aby uzyskać wszystkie kolumny typu „obiektowego”:

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

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

Tylko lista:

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

['C', 'D']   
MLKing
źródło
3

Jeśli chcesz listę tylko kolumn obiektowych, możesz:

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

a następnie, jeśli chcesz uzyskać kolejną listę tylko liczb:

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

źródło
0

Wymyśliłem ten trzy liniowiec .

Zasadniczo oto, co robi:

  1. Pobierz nazwy kolumn i odpowiadające im typy danych.
  2. Opcjonalnie wysyłam go do pliku csv.

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

To znacznie ułatwiło mi życie w generowaniu schematów w locie. Mam nadzieję że to pomoże

geekidharsh
źródło
0

dla 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
źródło
0

Używam infer_objects ()

Docstring: próba wnioskowania o lepszych typach dla kolumn obiektowych.

Próbuje miękkiej konwersji kolumn typu obiektowego, pozostawiając kolumny nieobiektywne i niewymienialne bez zmian. Reguły wnioskowania są takie same jak podczas normalnej budowy Series / DataFrame.

df.infer_objects().dtypes

jak gdyby
źródło