Как применить функцию к нескольким столбцам, чтобы создать несколько столбцов в Pandas? - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь применить функцию к нескольким столбцам и, в свою очередь, создать несколько столбцов для подсчета длины каждой записи.

В основном у меня есть 5 столбцов с индексами 5,7,9,13 и 15 икаждая запись в этих столбцах является строкой вида 'WrappedArray(|2008-11-12, |2008-11-12)', и в своей функции я пытаюсь удалить часть обернутого массива, разделить два значения и сосчитать (length - 1), используя следующее:

def updates(row,num_col):
    strp = row[num_col.strip('WrappedAway')
    lis  = list(strp.split(','))
    return len(lis) - 1

гдеnum_col - это индекс столбца, а cal принимает значение 5,7,9,13,15.Я сделал это, но только для 1 столбца:

fn = lambda row: updates(row,5)
col = df.apply(fn, axis=1)
df = df.assign(**{'count1':col.values})

Я хочу применить эту функцию ко ВСЕМ столбцам (не только 5, как указано выше) с указанными индексами, а затем создать отдельный столбец, связанный со столбцами.5,7,9,13 и 15 все в коротком коде вместо того, чтобы делать это отдельно для каждого значения.

Надеюсь, я понял.

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

Я думаю, что мы можем использовать панд str.count()

df= pd.DataFrame({
    "col1":['WrappedArray(|2008-11-12, |2008-11-12)',
            'WrappedArray(|2018-11-12, |2017-11-12, |2018-11-12)'],
    "col2":['WrappedArray(|2008-11-12, |2008-11-12,|2008-11-12,|2008-11-12)',
            'WrappedArray(|2018-11-12, |2017-11-12, |2018-11-12)']})
df["col1"].str.count(',')
0 голосов
/ 26 ноября 2018

Что касается нахождения количества элементов в списке, похоже, вы могли бы просто использовать str.count(), чтобы найти количество ',' в строках.И чтобы применить определенную функцию к набору столбцов, вы можете сделать что-то вроде:

cols = [5,7,9,13,15]

for col in cols:
    col_counts = {'{}_count'.format(col): df.iloc[:,col].apply(lambda x: x.count(','))}
    df = df.assign(**col_counts)

В качестве альтернативы вы также можете использовать strip('WrappedAway').split(',') в качестве используемого:

def count_elements(x):
    return len(x.strip('WrappedAway').split(',')) - 1

for col in cols:
    col_counts = {'{}_count'.format(col): 
                   df.iloc[:,col].apply(count_elements)}
    df = df.assign(**col_counts)

Так, например, со следующим фреймом данных:

df = pd.DataFrame({'A': ['WrappedArray(|2008-11-12, |2008-11-12, |2008-10-11)', 'WrappedArray(|2008-11-12, |2008-11-12)'],
               'B': ['WrappedArray(|2008-11-12,|2008-11-12)', 'WrappedArray(|2008-11-12, |2008-11-12)'],
               'C': ['WrappedArray(|2008-11-12|2008-11-12)', 'WrappedArray(|2008-11-12|2008-11-12)']})

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

for col in [0,1,2]:
    col_counts = {'{}_count'.format(col): 
                  df.iloc[:,col].apply(count_elements)}
    df = df.assign(**col_counts)

Получит:

 A  \
0  WrappedArray(|2008-11-12, |2008-11-12, |2008-1...   
1             WrappedArray(|2008-11-12, |2008-11-12)   

                                    B  \
0   WrappedArray(|2008-11-12,|2008-11-12)   
1  WrappedArray(|2008-11-12, |2008-11-12)   

                                  C         0_count  1_count  2_count  
0  WrappedArray(|2008-11-12|2008-11-12)        2        1        0  
1  WrappedArray(|2008-11-12|2008-11-12)        1        1        0 
0 голосов
/ 26 ноября 2018

Вы путаете операции по строкам и столбцам, пытаясь выполнить обе функции в одной функции.Выберите один или другой.Операции в столбцах обычно более эффективны, и вы можете использовать методы Pandas str.

Настройка

df = pd.DataFrame({'A': ['WrappedArray(|2008-11-12, |2008-11-12, |2008-10-11)', 'WrappedArray(|2008-11-12, |2008-11-12)'],
                   'B': ['WrappedArray(|2008-11-12,|2008-11-12)', 'WrappedArray(|2008-11-12|2008-11-12)']})

Логика

# perform operations on strings in a series
def calc_length(series):
    return series.str.strip('WrappedAway').str.split(',').str.len() - 1

# apply to each column and join to original dataframe
df = df.join(df.apply(calc_length).add_suffix('_Length'))

Результат

print(df)

                                                   A  \
0  WrappedArray(|2008-11-12, |2008-11-12, |2008-1...   
1             WrappedArray(|2008-11-12, |2008-11-12)   

                                       B  A_Length  B_Length  
0  WrappedArray(|2008-11-12,|2008-11-12)         2         1  
1   WrappedArray(|2008-11-12|2008-11-12)         1         0  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...