假设我有一个pandas数据帧,其中2列由字符串列表组成,如下所示
df=pd.DataFrame( {'A' : [ ['a','b','c'], ['d','e','f'] ], 'B':[ ['g','h','i'], ['j','k','l'] ] })
我希望将A中第一个列表中的第一个字符串元素与带有连字符的B中第一个列表中的第一个字符串元素连接起来,依此类推。最终产品将是另一列C,以便
df['C'] = [ ['a-g','b-h','c-i'], ['d-j','e-k','f-l' ] ]
我尝试了使用apply()和map()的不同功能,但没有任何东西产生所需的结果,任何帮助都表示赞赏。
答案 0 :(得分:2)
您可以使用str.cat
:
df['C'] = df.A.str.cat(df.B, sep='-')
df
# A B C
#0 a e a-e
#1 b f b-f
#2 c g c-g
#3 d h d-h
或直接添加两列:
df.A + '-' + df.B
#0 a-e
#1 b-f
#2 c-g
#3 d-h
#dtype: object
对编辑过的数据更新:
df=pd.DataFrame({'A':[['a','b','c'], ['d','e','f']], 'B':[['g','h','i'], ['j','k','l']]})
df['C'] = df.apply(lambda r: [a+'-'+b for a,b in zip(r.A, r.B)], axis=1)
df
# A B C
#0 [a, b, c] [g, h, i] [a-g, b-h, c-i]
#1 [d, e, f] [j, k, l] [d-j, e-k, f-l]
答案 1 :(得分:1)
我会使用apply
+ np.core.defchararray.add
:
from numpy.core.defchararray import add
df['C'] = df[['A', 'B']].apply(lambda x: add(add(x.A, '-'), x.B).tolist(), 1)
df
A B C
0 [a, b, c] [g, h, i] [a-g, b-h, c-i]
1 [d, e, f] [j, k, l] [d-j, e-k, f-l]
请记住我所说的关于在列表中存储数据的内容。
如果您的列可能不是同等大小,则可以执行if
检查:
def foo(x):
if len(x.A) == len(x.B):
return add(add(x.A, '-'), x.B).tolist()
return []
df['C'] = df[['A', 'B']].apply(foo, 1)
答案 2 :(得分:1)
选项1
使用numpy.core.defchararray.add
from numpy.core.defchararray import add
a = np.array(df.values.tolist())
df.assign(C=add(add(a[:, 0], '-'), a[:, 1]).tolist())
A B C
0 [a, b, c] [g, h, i] [a-g, b-h, c-i]
1 [d, e, f] [j, k, l] [d-j, e-k, f-l]
选项2
使用list
的自定义子类并重新定义+
class list_(list):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def __add__(self, other):
return list_(map('-'.join, (map(str, t) for t in zip(self, other))))
df.assign(C=df.applymap(list_).sum(1).apply(list))
A B C
0 [a, b, c] [g, h, i] [a-g, b-h, c-i]
1 [d, e, f] [j, k, l] [d-j, e-k, f-l]