将Pandas的多个字符串列转换为整数列表

3

我有一个数据框 df,其中两列均为object类型。

    +-----+--------------------+--------------------+
    |  id |         col1       |         col2       |
    +-----+--------------------+--------------------+
    |   1 |  0,1,4,0,1         |  1,2,4,0,0         |
    +-----+--------------------+--------------------+

我将它们转换成如下列表:
test = df["col1"]+','+df["col2"]
test.tolist()

它会将下面的结果作为一个字符串元素放入列表中

['0,1,4,0,1,1,2,4,0,0']

然而,我希望它们以整数列表的形式呈现,就像这样。
[0,1,4,0,1,1,2,4,0,0] 

有什么建议吗?顺便说一下,我的原始数据集中列非常大,因此性能可能也是一个问题。


您是否可以控制最初创建这些列的方式?如果性能可能成为问题,那么这就是值得花费精力的地方。 - ALollz
它们来自CSV文件。 - Abu Shoeb
3个回答

5

我想您是想要:

(df['col1'] + ',' + df['col2']).apply(lambda row: [int(s) for s in row.split(',')])

输出:

0    [0, 1, 4, 0, 1, 1, 2, 4, 0, 0]
dtype: object

如何将其作为纯list而不是对象,因为输出将传递给其他函数进行处理? - Abu Shoeb
你的数据框是否只有一行? - Quang Hoang
好问题。我确实有多行数据,但是在预处理中,我已经确保一次只传入一行数据。如果解决方案可以处理多行数据,那会更好 :-) - Abu Shoeb
1
这个解决方案为您提供了一系列列表,每个列表代表一行。因此,如果您想将每个列表传递给您的函数,您可以使用循环for r in series: your_func(r),其中series是上面的输出。 - Quang Hoang

3

另一种方法是使用 str.splitexplode

arr = df.set_index('id').stack().str.split(',').explode().astype(int).values

print(arr)
array([0, 1, 4, 0, 1, 1, 2, 4, 0, 0])

遇到了这个错误 AttributeError: 'Series'对象没有'explode'属性 - Abu Shoeb
@AbuShoeb,你使用的pandas版本是多少?这个功能是在0.25版本中添加的。 - Umar.H
我明白了。我的版本是0.23.4。 - Abu Shoeb
如果你可以升级的话就这么做,否则你可以在 str.split 中使用参数 expand=True,之后再次使用栈。 - Umar.H

0

你可以用 map 来完成它

 test = str(df["col1"]+','+df["col2"])
 list(map(int, test.split(','))) 

正如我在另一个答案中提到的,是否可能将最终结果作为列表而不是映射对象呈现? - Abu Shoeb
将整个内容强制转换为列表。已更新。 - MohitC
我想我之前尝试过,现在再次尝试,结果出现了“ValueError: invalid literal for int() with base 10: '0 1'”错误。 - Abu Shoeb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接