Pandas DataFrame эффективно применяет различные функции к нескольким столбцам - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь организовать фрейм данных, разделив столбец 'text' запятыми, что можно увидеть по: transcript_dataframe['text'].str.split(pat = delimiter, expand = True).Тем не менее, при запуске этого через фрейм данных с несколькими миллионами строк процесс очень медленный.Мне было интересно, есть ли на самом деле более быстрый способ сделать это, и можно ли было обернуть индикатор прогресса tqdm вокруг этого метода, чтобы увидеть прогресс.

Далее, так как я прохожу несколько миллионов строкВы можете видеть, что я использую apply примерно четыре раза (что означает, что я прохожу все несколько миллионов строк четыре раза).Есть ли способ сделать всю эту обработку в один цикл?Что я хочу для вывода - это фрейм данных с:

RecordID (string, removed BOM)

Content (string with blank or pipe characters removed)

call_time_seconds (end time - call time, after converting to float, np.nan if error)

count_calls (just 1 throughout)

Наконец, я хочу удалить все 'RecordIDs', которые имеют 'M', внутри которых я сделал с этой строкой:

transcripts_df = transcripts_df[transcripts_df['RecordID'].progress_apply(lambda x: bool(re.match('M', str(x)))) != True]

Вот мой код:

def CleanTranscripts(transcript_dataframe):
        """
        Cleans up transcript dataframe by splitting 'text' column with delimiter
        Data is as follows: RecordID | _(unused) | StartTime | EndTime | Content | _(unused) | _(unused)
        Split data is put into the following columns:
                * RecordID : removed byte order mark (BOM - \ufeff)
                * Content : removed blank or | characters
                * call_time_seconds : uses EndTime converted into seconds - StartTime converted into seconds
                * count_calls : each unique call identified by RecordID will be 1, used in future dataframe merge with prospect table

        Arguments:
                * transcript_dataframe (pandas.DataFrame) -- the raw transcript dataframe acquired from ImportTranscripts() method

        Returns:
                * transcrips_df (pandas.DataFrame) -- cleaned up transcript dataframe with columns of interest, consolidated on a per call level
        """
        tqdm.pandas(desc="Cleaning Transcripts")
        delimiter = r'\|'  # delimiter defined as an escaped pipe character

        transcripts_df = transcript_dataframe['text'].str.split(pat = delimiter, expand = True) # expands transcript dataframe separated by commma
        transcripts_df.columns = ['RecordID', 1, 'start_time', 'end_time', 'Content', 7, 8]     # rename column names
        transcripts_df = transcripts_df[transcripts_df['RecordID'].progress_apply(lambda x: bool(re.match('M', str(x)))) != True]  # remove rows with RecordID that has 'M'
        transcripts_df['RecordID'] = transcripts_df['RecordID'].progress_apply(lambda x: re.sub('(\ufeff)','',str(x)[0:8]))        # remove BOM, take substring 0:8
        transcripts_df['Content'] = transcripts_df['Content'].progress_apply(lambda x: re.sub(r'( )|(\|)','',str(x)))     # remove blank or pipe characters
        transcripts_df.loc[:,'call_time_seconds'] = pd.to_numeric(transcripts_df['end_time'], errors='coerce') - pd.to_numeric(transcripts_df['start_time'], errors='coerce')   # convert end time into seconds, subtract start time converted into seconds
        transcripts_df = transcripts_df.groupby('RecordID').agg({'Content': 'sum', 'call_time_seconds': 'max'}).reset_index()   # group records by RecordID, aggregate rows with same RecordID by summing the contents, and taking max call time
        transcripts_df['count_calls'] = 1       # assign 1 to count_calls columns (each RecordID is one call, used for future merging)
        return transcripts_df   # return consolidated and cleaned transcripts dataframe

Спасибо за любую помощь, спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...