如何将项目附加到 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 解决方案的启发,但未修改 A
和 B
列:
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】:
一个好的一般规则是尽可能避免将apply
与axis=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 中不同列的列表中的主要内容,如果未能解决你的问题,请参考以下文章