Str split с расширением в Dask - PullRequest
1 голос
/ 22 апреля 2019

У меня 34 миллиона строк и только столбец. Я хочу разбить строку на 4 столбца.

Вот мой примерный набор данных (df):

    Log
0   Apr  4 20:30:33 100.51.100.254 dns,packet user: --- got query from 10.5.14.243:30648:
1   Apr  4 20:30:33 100.51.100.254 dns,packet user: id:78a4 rd:1 tc:0 aa:0 qr:0 ra:0 QUERY 'no error'
2   Apr  4 20:30:33 100.51.100.254 dns,packet user: question: tracking.intl.miui.com:A:IN
3   Apr  4 20:30:33 dns user: query from 9.5.10.243: #4746190 tracking.intl.miui.com. A

Я хочу разбить его на четыре столбца, используя этот код:

df1 = df['Log'].str.split(n=3, expand=True)
df1.columns=['Month','Date','Time','Log']
df1.head()

Вот результат, который я ожидал

     Month Date      Time                                              Log
0      Apr    4  20:30:33  100.51.100.254 dns,packet user: --- go...
1      Apr    4  20:30:33  100.51.100.254 dns,packet user: id:78a...
2      Apr    4  20:30:33  100.51.100.254 dns,packet user: questi...
3      Apr    4  20:30:33  dns transjakarta: query from 9.5.10.243: #474...
4      Apr    4  20:30:33  100.51.100.254 dns,packet user: --- se...

но ответ таков:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-36-c9b2023fbf3e> in <module>
----> 1 df1 = df['Log'].str.split(n=3, expand=True)
      2 df1.columns=['Month','Date','Time','Log']
      3 df1.head()

TypeError: split() got an unexpected keyword argument 'expand'

Есть ли решение разбить строку, используя dask?

1 Ответ

3 голосов
/ 27 апреля 2019

Редактировать: теперь это работает

Фрейм данных Dask поддерживает метод расширения = ключевое слово в методе str.split, если , вы также указали ключевое слово n=, чтобы указать, сколько сплитов ожидать.

Старый ответ

Похоже, что метод dask dataframes str.split не реализует ключевое слово expand =. Вы можете поднять проблему, если она еще не существует.

В качестве краткосрочного обходного пути вы можете создать функцию Pandas, а затем использовать метод map_partitions для масштабирования по всему фрейму данных dask

def f(df: pandas.DataFrame) -> pandas.DataFrame:
    """ This is your code from above, as a function """
    df1 = df['Log'].str.split(n=3, expand=True)
    df1.columns=['Month','Date','Time','Log']
    return df

ddf = ddf.map_partitions(f)  # apply to all pandas dataframes within dask dataframe

Поскольку кадры данных Dask - это просто наборы кадров данных Pandas, относительно легко создавать вещи самостоятельно, когда кадр данных Dask их не поддерживает.

...