如何将项目附加到Pandas中不同列的列表中

时间:2017-01-20 12:43:27

标签: python list pandas dataframe append

我有一个如下所示的数据框:

dic = {'A':['PINCO','PALLO','CAPPO','ALLOP'],
       'B':['KILO','KULO','FIGA','GAGO'],
       'C':[['CAL','GOL','TOA','PIA','STO'],
            ['LOL','DAL','ERS','BUS','TIS'],
            ['PIS','IPS','ZSP','YAS','TUS'],
            []]}
df1 = pd.DataFrame(dic)

我的目标是为每一行插入A元素作为列C中包含的列表的第一项。同时,我想将B的元素设置为C中包含的列表的最后一项。

我能够通过使用以下代码行来实现我的目标:

for index, row in df1.iterrows():
    try:
        row['C'].insert(0,row['A'])
        row['C'].append(row['B'])
    except:
        pass

是否有一种更优雅高效的方式来实现我的目标,可能使用一些Pandas功能?我想尽可能避免循环。

3 个答案:

答案 0 :(得分:2)

受到Ted解决方案的启发,但没有修改列AB

def tolist(value):
    return [value]

df1.C = df1.A.map(tolist) + df1.C + df1.B.map(tolist)

使用apply,您不会编写显式循环:

def modify(row):
    row['C'][:] = [row['A']] + row['C'] + [row['B']]

df1.apply(modify, axis=1)

答案 1 :(得分:2)

一个好的一般规则就是尽量避免将applyaxis=1一起使用,因为迭代行是费用

您可以将A列和B列中的每个元素转换为map的列表,然后对各行求和。

df1['A'] = df1.A.map(lambda x: [x])  
df1['B'] = df1.B.map(lambda x: [x])
df1.sum(1)
CPU times: user 3.07 s, sys: 207 ms, total: 3.27 s

另一种方法是使用apply,其中轴= 1,在我的计算机上以100万行的速度运行15倍

df1.apply(lambda x: [x['A']] + x['C'] + [x['B']], 1)
CPU times: user 48.5 s, sys: 119 ms, total: 48.6 s

答案 2 :(得分:0)

将列表理解与df1.values.tolist()

一起使用
pd.Series([[r[0]] + r[2] + [r[1]] for r in df1.values.tolist()], df1.index)

0    [PINCO, CAL, GOL, TOA, PIA, STO, KILO]
1    [PALLO, LOL, DAL, ERS, BUS, TIS, KULO]
2    [CAPPO, PIS, IPS, ZSP, YAS, TUS, FIGA]
3                             [ALLOP, GAGO]
dtype: object

时间测试

enter image description here