Как создать класс-функцию для python с функцией Astype? - PullRequest
0 голосов
/ 01 июля 2019

В фрейме данных много столбцов, таких как:

   df_train_data['material'] = df_train_data['material'].astype('category',ordered=False)
   df_train_data['aircon'] = df_train_data['aircon'].astype('category',ordered=False)
   df_train_data['building_quality'] = df_train_data['building_quality'].astype('category',ordered=True)
   df_train_data['fireplace'] = df_train_data['fireplace'].astype('category',ordered=False)
   .
   .
   .
   df_test_data.....

Для данных и тестовых кадров. Таким образом, вместо того, чтобы писать 20-30 нечетных строк для каждого столбца в поезде и для каждого снова в тесте, Как записать их в функцию, где мы можем передать только имена столбцов (через запятую) и упорядочить в качестве аргумента в функции?

Я могу думать только об одном: (новичок в программировании)

  def data_type(df_name,col,ord_type):
      return df_name[col] = df_name[col].astype('category',ordered = ord_type)

Как сделать это для нескольких имен столбцов одновременно?

Ответы [ 3 ]

2 голосов
/ 01 июля 2019

На самом деле ваш ответ работает для нескольких столбцов, просто используйте списки вместо отдельных значений:

df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
                   columns=['a', 'b', 'c'])

def data_type(df_name,col,ord_type):
      return df_name[col].astype('category',ordered = ord_type)

cols = ['a', 'b']

df[cols] = data_type(df, cols, [True, False])

df теперь:

    a   b   c
0   1   2   3
1   4   5   6
2   7   8   9

с dtypes:

a    category
b    category
c       int32
dtype: object
1 голос
/ 01 июля 2019

Если фокусироваться только на настройке / изменении типа для большого количества столбцов (всех столбцов) одновременно для нескольких кадров данных: pandas.DataFrame.astype позволяет передавать dict of column name -> data type (в качестве 1-го аргумента):

from itertools import zip_longest

...
df_train_data.astype(dict(zip_longest(df_train_data.columns, ('category',), fillvalue='category')))
df_test_data.astype(dict(zip_longest(df_test_data.columns, ('category',), fillvalue='category')))
1 голос
/ 01 июля 2019

Может помочь

data = pd.read_excel(r"<file_location>.xlsx")
def data_type(df, as_type, ordered, *cols):
    for col in cols:
        df[col] = df[col].astype(as_type, ordered=False)
    return df

df = data_type(data, 'category', 'False', data.columns)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...