【问题标题】:pandas dataframe to correct data types after a split of a non-delimited text field熊猫数据框在拆分非分隔文本字段后更正数据类型
【发布时间】:2021-05-15 06:08:38
【问题描述】:

我有一个包含非结构化数据的 excel 文件。 1 列包含 4 条数据的文本,我正在将其导入数据框...某些数据可能与该列的预期不匹配

03/04/21    08:08:26  ->  -   50.20
03/04/21    11:08:26  ->  +  283.75
03/04/21    10:48:34  ->  Scale Timeout

我可以.split(' ', expand=True) 这个来获得 12 列。

             0 1  2  3          4 5    6 7   8 9       10     11
0     03/04/21           08:08:26     ->     -             50.20
1     03/04/21           08:28:26     ->     -             50.20

当我复制 cols[0,4,8,11]、重命名它们并复制到新的 df 时,这就像一个典型的数据框:

          date      time sign   mass
0     03/04/21  08:08:26    -  50.20
1     03/04/21  08:28:26    -  50.20
2     03/04/21  08:48:26    -  50.15

现在事情向南......我什至不能print(df['date'])

我得到错误: 只有整数标量数组可以转换为标量索引

我检查了 dtype,所有 cols 都是类型对象。我试过 .astype(str),但仍然得到同样的错误

#困惑

一定是 .split() 创建了我没有正确寻址的 dtype?

【问题讨论】:

    标签: python pandas dtype


    【解决方案1】:

    包含非结构化数据的原始数据框:

    df:

                                       col
    0  03/04/21    08:08:26  ->  -   50.20
    1  03/04/21    11:08:26  ->  +  283.75
    2  03/04/21    10:48:34  ->  -  50.15
    

    然后在您的 df 上尝试以下操作:

    df2 = pd.DataFrame(df.col.str.split().str.join(' ').str.split(' ').values.tolist(), columns=['date','time','symbol','sign','mass'])
    

    df2:

           date      time symbol sign    mass
    0  03/04/21  08:08:26     ->    -   50.20
    1  03/04/21  11:08:26     ->    +  283.75
    2  03/04/21  10:48:34     ->    -   50.15
    

    df2 将所有不同的数据作为单独的列。现在您可以从 df2 中选择您需要的列。

    print(df2['date'])
    0    03/04/21
    1    03/04/21
    2    03/04/21
    Name: date, dtype: object
    

    我所做的是首先删除非结构化数据中所有额外的空格,然后用一个空格替换它们。然后我在该数据上应用split(' ') 以划分为所需的数据。

    【讨论】:

    • 这行得通,谢谢。如果我遵循正确,这是一种将非结构化数据解析为列的更简洁的方法,并将数据以熊猫可以识别的正确格式拉入 df
    • 正确。根据非结构化数据的多少,还可以有其他更简洁的方法,但这种方法适合您的情况。
    【解决方案2】:

    当你复制到新的 df 时,它将是新的列表。

    您必须使用 print(df[0]) 来打印日期。 df[1] 代表时间,df[2] 代表符号,df[3] 代表质量

    只有整数标量数组可以转换为标量索引

    df是一个list对象,可以查看df的数据类型,list中的index只能使用整数

    【讨论】:

    • 感谢您的意见。我不明白为什么我不能按名称寻址列,因为我在.split() 操作分配整数后为每一列分配了名称,但@Ank 的回答解决了这个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 2013-06-23
    • 2019-10-26
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多