Переименование столбцов в фрейме данных dask

У меня два вопроса по Dask. Во-первых: в документации для dask четко указано, что вы можете переименовывать столбцы с тем же синтаксисом, что и pandas. Я использую dask 1.0.0. По какой-либо причине я получаю эти ошибки ниже?

df = pd.DataFrame(dictionary)
df

Переименование столбцов в фрейме данных dask

# I am not sure how to choose values for divisions, meta, and name. I am also pretty unsure about what these really do.
ddf = dd.DataFrame(dictionary, divisions=[8], meta=pd.DataFrame(dictionary), name='ddf')    
ddf

Переименование столбцов в фрейме данных dask

cols = {'Key':'key', '0':'Datetime','1':'col1','2':'col2','3':'col3','4':'col4','5':'col5'}

ddf.rename(columns=cols, inplace=True)

TypeError: rename() got an unexpected keyword argument 'inplace'

Итак, я удалил inplace=True и попробовал следующее:

ddf = ddf.rename(columns=cols)

ValueError: dictionary update sequence element #0 has length 6; 2 is required

Фреймворк данных pandas показывает реальный фрейм данных, но когда я вызываю ddf.compute(), я получаю пустой фрейм данных.

Переименование столбцов в фрейме данных dask

Мой второй вопрос заключается в том, что я немного не понимаю, как назначать подразделения, мета и имя. Насколько это полезно / вредно, если я использую dask для распараллеливания на одной машине по сравнению с кластером?

FWIW, создание словаря для переназначения каждого имени столбца (даже тех, которые я не хочу изменять, а затем использование ddf = ddf.rename(columns=cols), отлично сработало для меня.

SummerEla 22.12.2018 07:14
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
7
1
9 157
3

Ответы 3

Что касается переименования, я обычно меняю имена функций, когда использую dask, возможно, это сработает и для вас:

new_columns = ['key', 'Datetime', 'col1', 'col2', 'col3', 'col4', 'col5']
df = df.rename(columns=dict(zip(df.columns, new_columns)))

Что касается определения количества разделов, документация дает довольно хороший пример использования данных временных рядов для принятия решения о том, как разделить фрейм данных: http://docs.dask.org/en/latest/dataframe-design.html#partitions.

Я не мог заставить эту строку работать (потому что я передавал dictionary в качестве базового словаря Python, что не является правильным вводом)

ddf = dd.DataFrame(dictionary, divisions=[2], meta=pd.DataFrame(dictionary,
                                              index=list(range(2))), name='ddf')

print(ddf.compute())
() # this is the output of ddf.compute(); clearly something is not right

Итак, мне пришлось создать несколько фиктивных данных и использовать их в моем подходе к созданию dask dataframe.

Создание фиктивных данных в словаре

d = {0: [388]*2,
 1: [387]*2,
 2: [386]*2,
 3: [385]*2,
 5: [384]*2,
 '2012-06-13': [389]*2,
 '2012-06-14': [389]*2,}

Создать Dask dataframe из Словарьсумка для посуды

  • это означает, что вы должны сначала использовать pandas, чтобы преобразовать словарь в pandas DataFrame, а затем использовать .to_dict(..., orient='records'), чтобы получить последовательность (список строковых словарей), необходимую для создания пакета dask

Итак, вот как я создал нужную последовательность

d = pd.DataFrame(d, index=list(range(2))).to_dict('records')

print(d)
[{0: 388,
  1: 387,
  2: 386,
  3: 385,
  5: 384,
  '2012-06-13': 389,
  '2012-06-14': 389},
 {0: 388,
  1: 387,
  2: 386,
  3: 385,
  5: 384,
  '2012-06-13': 389,
  '2012-06-14': 389}]

Теперь использую список словарей для создания dask bag

dask_bag = db.from_sequence(d, npartitions=2)

print(dask_bag)
dask.bag<from_se..., npartitions=2>

Переделать dask bag в dask dataframe

df = dask_bag.to_dataframe()

Переименовать столбцы в dask dataframe

cols = {0:'Datetime',1:'col1',2:'col2',3:'col3',5:'col5'}
df = df.rename(columns=cols)

print(df)
Dask DataFrame Structure:
              Datetime   col1   col2   col3   col5 2012-06-13 2012-06-14
npartitions=2                                                           
                 int64  int64  int64  int64  int64      int64      int64
                   ...    ...    ...    ...    ...        ...        ...
                   ...    ...    ...    ...    ...        ...        ...
Dask Name: rename, 6 tasks

Вычислить dask dataframe (на этот раз не будет вывода ()!)

print(ddf.compute())
   Datetime  col1  col2  col3  col5  2012-06-13  2012-06-14
0       388   387   386   385   384         389         389
0       388   387   386   385   384         389         389

Примечания:

  1. Также из документации .rename: inplace не поддерживается.
  2. Я думаю, ваш словарь переименования содержал строки '0', '1' и т. д. Для имен столбцов, которые были целыми числами. Возможно, для ваших данных (как в случае с фиктивными данными здесь) словарь должен быть просто целыми числами 0, 1 и т. д.
  3. Согласно dask документы, я использовал этот подход, основанный на переименовании словаря 1-1, и имена столбцов не входит в переименование слов будут оставлены без изменений.
    • это означает, что вам не нужно передавать имена столбцов, которые не нужно переименовывать

Если вы хотите только строчные буквы и удалить пробелы, вы можете сделать:

data = dd.read_csv('*.csv').rename(columns=lambda x: x.lower().replace(' ', '_'))

Другие вопросы по теме