我有一个如下所示的数据框:
[['label1', 'label2']
['1 2 3', '1 2 3']
['4 5 6', '4 5 7']]
因此每列都被视为字符串。我想在两个标签的每个元素之间应用l2距离,所以我需要将列转换为float列表。
有没有“干净”的方法来做到这一点,比使用[float(x) for x in element.split()]
之类的双循环更好?
(我的数据框很大,所以我想要一些非常优化的东西)
答案 0 :(得分:2)
使用:
df = df.applymap(lambda x: [float(y) for y in x.split()])
print (df)
label1 label2
0 [1.0, 2.0, 3.0] [1.0, 2.0, 3.0]
1 [4.0, 5.0, 6.0] [4.0, 5.0, 7.0]
另一种解决方案:
a = [[list(map(float, x.split())) for x in df[v].values.tolist()] for v in df.columns]
print (a)
[[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]], [[1.0, 2.0, 3.0], [4.0, 5.0, 7.0]]]
df = pd.DataFrame(a)
print (df)
0 1
0 [1.0, 2.0, 3.0] [4.0, 5.0, 6.0]
1 [1.0, 2.0, 3.0] [4.0, 5.0, 7.0]
答案 1 :(得分:1)
应用str.join
,加入两列,然后使用str.split
再次拆分。最后,使用df.astype
转换为float。
df
label1 label2
0 1 2 3 1 2 3
1 4 5 6 4 5 7
df = df.apply(' '.join).str.split(expand=True).astype(float).T
df
label1 label2
0 1.0 1.0
1 2.0 2.0
2 3.0 3.0
3 4.0 4.0
4 5.0 5.0
5 6.0 7.0
根据您的评论,使用applymap
(慢)
from functools import partial
f = partial(lambda x: [float(y) for y in x.split()])
df = df.applymap(f)
df
label1 label2
0 [1.0, 2.0, 3.0] [1.0, 2.0, 3.0]
1 [4.0, 5.0, 6.0] [4.0, 5.0, 7.0]
要仅将其应用于某些列,请使用
c = ['label1', 'label2'] # add any other columns, if you want
df[c] = df[c].applymap(f)
请注意,通过将列保留为列表,您将失去所有pandas
矢量化优势。