Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在数据帧中将空格分隔的整数转换为列表_Python_Pandas_Dataframe - Fatal编程技术网

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,我先有这个,它与部分的不同…:(我本可以和你争论,但我删除了我的答案:)