Python 在数据帧中将空格分隔的整数转换为列表
我有一个如下所示的数据帧:Python 在数据帧中将空格分隔的整数转换为列表,python,pandas,dataframe,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()]的双for循环更好? (我的数据帧非常大,所以我想要一些非常优化的东西)应用str.join,连接两列,然后使用st
[['label1', 'label2']
['1 2 3', '1 2 3']
['4 5 6', '4 5 7']]
因此,每列都被视为字符串。我想在两个标签的每个元素之间应用l2距离,所以我需要将列转换为float列表
有没有一种“干净”的方法可以做到这一点,比使用类似于[float(x)for x in element.split()]
的双for循环更好?
(我的数据帧非常大,所以我想要一些非常优化的东西)应用
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
(慢速)
要仅将此应用于某些列,请使用
c = ['label1', 'label2'] # add any other columns, if you want
df[c] = df[c].applymap(f)
请注意,如果将列保留为列表,您将失去所有的
pandas
矢量化优势 应用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
(慢速)
要仅将此应用于某些列,请使用
c = ['label1', 'label2'] # add any other columns, if you want
df[c] = df[c].applymap(f)
请注意,如果将列保留为列表,您将失去所有的pandas
矢量化优势 使用:
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]
使用:
另一个解决方案:
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]
您是否尝试过将pd.to_numeric()?我不知道性能如何,但它确实符合你的要求。我试过了,但我无法应用它。。总是收到错误消息!我做了
pd.to\u numeric(my\u df)
我得到了一个TypeError
,如果我做了pd.to\u numeric(my\u df.label1)
我得到了ValueError
pd.to\u numeric()只对序列有效你试过pd.to\u numeric()
?我不知道性能如何,但它确实符合你的要求。我试过了,但我无法应用它。。总是收到错误消息!我做了pd.to\u numeric(my\u df)
我得到了一个TypeError
如果我做了pd.to\u numeric(my\u df.label1)
我得到了ValueError
pd.to\u numeric()只对序列有效可能我的问题不清楚:我想做每行之间的距离:dist([1 2 3],[1 2 3])=0
和dist([4 5 6],[4 5 7])!=0
。因此我需要保留每行,但只需将类型从string转换为float@Arcyno这就是你要找的吗?请注意,保持列表列的速度非常慢。是的,它看起来很棒。让我测试一下!@Arcyno Minor speed gain使用functools。partial
是否有方法仅将其应用于某些列?(实际上我有一些列,比如我想保留为字符串的'label3'
)也许我的问题不清楚:我想计算每行之间的距离:dist([1 2 3],[1 2 3])=0
和dist([4 5 6],[4 5 7])!=0
。所以我需要保留每一行,但只需将类型从string转换为float@Arcyno这就是你要找的吗?请注意,保持列表列的速度非常慢。是的,它看起来很棒。让我测试一下!@Arcyno Minor speed gain使用functools。partial
是否有方法仅将其应用于某些列?(我实际上有一些列,比如说'label3'
,我想保留为字符串)啊,这是我的答案,请删除它:PSorry,我有第一个,这与部分不同…:(我本可以和你争论,但我删除了我的答案:)啊,这是我的答案,请删除它:PSorry,我先有这个,它与部分的不同…:(我本可以和你争论,但我删除了我的答案:)