Python Pandas:将对象列表转换为整数列表

时间:2019-03-13 14:44:07

标签: python pandas

您好,我有一个问题将对象列表转换为整数列表。这些对象位于熊猫数据框“ Kanten”的“ stopsequence”列中。在CSV导入和列中的数据清理之后,我收到了所有这些信息。我正在使用Python 3.X

我是Python新手,也许这是问题的一部分。

import pandas as pd
import numpy as np
import os
import re
import ast
orgn_csv = pd.read_csv(r"Placeholder path for csv file")
df = orgn_csv.dropna()
Kanten = pd.DataFrame({"stopsequence" : df.stopsequence})

# In between is a block in which I use regular expressions for data cleaning purposes.
# I left the data cleaning block out to make the post shorter


Kanten.stopsequence = Kanten.stopsequence.str.split (',')
print (Kanten.head())
print (Kanten.stopsequence.dtype)                      

这将提供以下输出:

                                        stopsequence
2  [67, 945, 123, 122, 996, 995, 80, 81, 184, 990...
3  [67, 945, 123, 122, 996, 995, 80, 81, 184, 990...
4  [67, 945, 123, 122, 996, 995, 80, 81, 184, 990...
5  [67, 945, 123, 122, 996, 995, 80, 81, 184, 990...
6  [67, 945, 123, 122, 996, 995, 80, 81, 184, 990...
object

我正在寻找一种转换包含对象的列表的方法。我仔细搜索了StackOverflow论坛,并尝试了许多不同的方法。没有他们,我就成功了。 我尝试使用:

Example plot

Kanten.stopsequence = Kanten.stopsequence.astype(str).astype(int)
This Returns:
ValueError: invalid literal for int() with base 10:

使用atoi而不是atof来使astype(str).astype(int)适应

Kanten.stopsequence.applymap(atoi)
This Returns:
AttributeError: 'Series' object has no attribute 'applymap'

following post

Kanten.stopsequence = list(map(int, Kanten.stopsequence))
This returns:
TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'

list(map())

Kanten.stopsequence = Kanten.stopsequence.apply(ast.literal_eval)
This returns:
TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'

有人看到解决方案吗?我不确定这是一个复杂的案例还是我缺乏进一步的编程经验。如果可能的话,简短的解释会有所帮助。我自己也可以找到解决办法。预先谢谢你。

3 个答案:

答案 0 :(得分:0)

大熊猫Series可以简单地转换为列表,并且可以将列表列表作为创建DataFrame的输入。

我认为这可以帮助您

splitted = pd.DataFrame(Kanten.stopsequence.str.split (','), index=Kanten.index).astype(int)

这将为您提供一个新的数据框,其索引与原始索引相同,但每个元素都在其自己的列中。

如果相关,则可以合并该新列

pd.concat([Kanten, splitted], axis=1)

答案 1 :(得分:0)

因此,从您第二次尝试处理数据时,错误消息告诉您Kanten.stopsequenceSeries,而不是DataFrame。要进行转换,您需要访问

list_of_lists = Kanten.stopsequence.to_numpy(dtype='int32').tolist()

请注意,这将为您的数据创建一个嵌套的2d数据数组。要访问第一行中的第一个整数,您需要编写list_of_lists[0][0]

答案 2 :(得分:0)

这就是我将DataFrame的最后一列拉到一个ints列表中的方式。

比方说.csv.py脚本位于同一目录中,称为kanten.csv。您要查找的列是stopsequence

import os
import pandas as pd

path=os.getcwd()
filename = 'kanten.csv'
filepath = os.path.join(path, filename)

kanten = pd.read_csv(filepath)
list = list(kanten['stopsequence'].apply(lambda x: int(x)))

在最后一行,将stopsequence列从kanten中拉出,将值强制转换为整数,然后将该列转换为标准的python列表对象。