将空格分隔的整数转换为数据框中的列表

时间:2017-09-11 08:40:43

标签: python pandas dataframe

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

[['label1', 'label2']
  ['1 2 3', '1 2 3']
  ['4 5 6', '4 5 7']]

因此每列都被视为字符串。我想在两个标签的每个元素之间应用l2距离,所以我需要将列转换为float列表。

有没有“干净”的方法来做到这一点,比使用[float(x) for x in element.split()]之类的双循环更好? (我的数据框很大,所以我想要一些非常优化的东西)

2 个答案:

答案 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矢量化优势。