Переименование столбцов в dask dataframe - PullRequest
0 голосов
/ 17 декабря 2018

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

df = pd.DataFrame(dictionary)
df

enter image description here

# 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

enter image description here

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(), я получаю пустой кадр данных.

enter image description here

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

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Я не мог заставить эту строку работать (потому что я передавал 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 из dictionary сумка для сумок

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

Итак, вот как я создал необходимую последовательность

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 в 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 docs , я использовал этот подход на основе словаря переименования 1-1 и имен столбцов , не включенных в диктовку переименования останется без изменений
    • это означает, что вам не нужнопередать имена столбцов, которые вам не нужно переименовывать
0 голосов
/ 17 декабря 2018

Что касается переименования, я обычно так изменяю имена компонентов, когда использую 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.

...