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

Posted

技术标签:

【中文标题】如何将项目附加到 Pandas 中不同列的列表中【英文标题】:How to append item to list of different column in Pandas 【发布时间】:2017-06-05 11:06:33 【问题描述】:

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

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 功能?我想尽可能避免 for 循环。

【问题讨论】:

你可以这样做df1.C = df1.apply(lambda x: [x.A] + x.C + [x.B], axis=1),这有点好,但它不是很有效...... 【参考方案1】:

受 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)

【讨论】:

df1.A.map(tolist) + df1.C + df1.B.map(tolist) +1【参考方案2】:

一个好的一般规则是尽可能避免将applyaxis=1 一起使用,因为迭代行很昂贵

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

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 和 axis=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

【讨论】:

不错的解决方案!【参考方案3】:

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

时间测试

【讨论】:

以上是关于如何将项目附加到 Pandas 中不同列的列表中的主要内容,如果未能解决你的问题,请参考以下文章

将列表中的索引附加到列表列表以创建 pandas df

PySpark Dataframe:将一个单词附加到列的每个值

迭代长列表以生成较小的列表并附加到 csv

将提取的列附加到没有索引的列表中:Pandas

使用 pandas 根据条件将 csv 值附加到列表

将 Pymongo 数据从列表附加到 pandas 数据框