如何将函数应用于多列以在Pandas中创建多列?

时间:2018-11-26 10:43:16

标签: python pandas

我试图在多个列上应用一个函数,然后创建多个列以计算每个条目的长度。

基本上我有5列索引分别为5、7、9、13和15的列,这些列中的每个条目都是'WrappedArray(|2008-11-12, |2008-11-12)'形式的字符串,在我的函数中,我尝试剥离wrappedArray部分并拆分两个值,并使用以下内容对(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 :(得分:0)

通过在一个函数中同时执行行和列操作,您会感到困惑。选择一个或另一个。按列操作通常更有效,您可以利用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  

答案 1 :(得分:0)

我认为我们可以使用熊猫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(',')

答案 2 :(得分:0)

关于查找列表中元素的数量,看起来您可以简单地使用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