【问题标题】:Python Pandas: convert list of objects to a list of integerPython Pandas:将对象列表转换为整数列表
【发布时间】:2019-08-04 07:01:22
【问题描述】:

您好,我有一个问题要将对象列表转换为整数列表。这些对象位于 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 论坛,尝试了很多不同的方法。没有他们我是成功的。 我尝试使用:

astype(str).astype(int)

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

使用 atoi 代替 atof 修改了 following post

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

list(map())

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'

apply(ast.literal_eval)

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'

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

【问题讨论】:

  • stopsequence 的样本?
  • 您说您从 CSV 文件导入此数据。为什么不直接从 CSV 创建 DataFrame
  • @DirtyBit 你的意思是我从 CSV 文件中加载的原始值的样本吗?
  • @emporerblk 我还添加了read_csv 以更清楚地说明我在做什么。我在做这件事的同时也在学习。所以我绝对有可能做的事情并不“理想”。

标签: python pandas


【解决方案1】:

这就是我将 DataFrame 的最后一列拉入整数列表的方法。

假设.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 列表对象。

【讨论】:

    【解决方案2】:

    因此,从您第二次尝试操作数据开始,您的错误消息告诉您Kanten.stopsequenceSeries,而不是DataFrame。要转换,您需要访问

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

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

    【讨论】:

      【解决方案3】:

      pandas Series 可以简单地转换为列表,并且可以将列表列表作为输入来创建DataFrame

      我认为这会有所帮助:

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

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

      如果相关,您可以连接这些新列

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

      【讨论】:

        猜你喜欢
        • 2018-05-17
        • 2018-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-02
        • 1970-01-01
        • 2021-08-08
        • 2011-04-14
        相关资源
        最近更新 更多