【问题标题】:how to create an object from a python array如何从python数组创建对象
【发布时间】:2021-02-04 20:29:43
【问题描述】:

我有以下结构,我从带有熊猫的 .txt 转换而来

 [[000001, 'PEPE                  ', 'S', 'LAST_NAME   ', 'CIP  ', 'CELLPHONE'],
 [0000002, 'LUIS  ', 'S', 'ADRESS  ', '                       ', 'nan'],
 [0000003, 'PEDRO               ', 'S', 'STREET ', 'CITY', ' nan']]

我的代码

import pandas as pd
file = 'C:\\Users\\Admin\\Desktop\\PRUEBA.txt'

columns = ("service", "name", "Active", "reference1", "reference2", "reference3")
df = pd.read_csv(file, sep="|", names=columns, header=None)
cl = df.values.tolist()
print(cl)

但是为了能够通过删除空字符串和 nan 对其进行所需的处理,我如何将服务转换为 int 并以这种方式基于服务和引用创建对象。

[
  { service: 1, name: 'PEPE', order: 0, ref: 'LAST_NAME' },
  { service: 1, name: 'PEPE', order: 1, ref: 'CIP' },
  { service: 1, name: 'PEPE', order: 2, ref: 'CELLPHONE' },
  { service: 2, name: 'LUIS', order: 0, ref: 'ADRESS' },
  { service: 3, name: 'PEDRO', order: 0, ref: 'STREET' },
  { service: 3, name: 'PEDRO', order: 1, ref: 'CITY' }
]

我如何才能做到这一点,非常感谢您的cmets

【问题讨论】:

  • d.to_dict('records')

标签: python-3.x pandas list dataframe


【解决方案1】:

键:使用df.melt() 取消透视表,然后执行df.to_dict(orient='records') 将数据帧转换为@QuangHoang 提到的面向记录的dict。其余的是定期过滤和杂项调整。

# data
ls = [['000001', 'PEPE                  ', 'S', 'LAST_NAME   ', 'CIP  ', 'CELLPHONE'],
      ['0000002', 'LUIS  ', 'S', 'ADRESS  ', '                       ', 'nan'],
      ['0000003', 'PEDRO               ', 'S', 'STREET ', 'CITY', ' nan']
      ]
df = pd.DataFrame(ls, columns=("service", "name", "Active", "reference1", "reference2", "reference3"))

# reformat and strip over each column
for col in df:
    if col == "service":
        df[col] = df[col].astype(int)
    else:
        df[col] = df[col].str.strip()  # accessor

# unpivot and adjust
df2 = df.melt(id_vars=["service", "name"],
              value_vars=["reference1", "reference2", "reference3"],
              value_name="ref")\
    .sort_values(by="service")\
    .drop("variable", axis=1)\
    .reset_index(drop=True)

# filter out empty or nan
df2 = df2[~df2["ref"].isin(["", "nan"])]

# generate order numbering by group
df2["order"] = df2.groupby("service").cumcount()
df2 = df2[["service", "name", "order", "ref"]]  # reorder

# convert to a record-oriented dict
df2.to_dict(orient='records')

Out[99]: 
[{'service': 1, 'name': 'PEPE', 'order': 0, 'ref': 'LAST_NAME'},
 {'service': 1, 'name': 'PEPE', 'order': 1, 'ref': 'CIP'},
 {'service': 1, 'name': 'PEPE', 'order': 2, 'ref': 'CELLPHONE'},
 {'service': 2, 'name': 'LUIS', 'order': 0, 'ref': 'ADRESS'},
 {'service': 3, 'name': 'PEDRO', 'order': 0, 'ref': 'STREET'},
 {'service': 3, 'name': 'PEDRO', 'order': 1, 'ref': 'CITY'}]

【讨论】:

  • 哇,非常感谢
  • df的格式和我的不一样吗? (您可以通过df.dtypes查看)
  • 是的,service = int32,我如何通过读取 int64 来增加它,你会如何做同样的事情,你在上面做了什么,但是 .txt 和 df.read_csv? dtypes: int32 service name object int64 order object ref
  • 我认为我的代码不会因为使用 np.int32 和 np.int64 之间的差异而中断。如果不需要 int64,只需执行 df[col] = df[col].astype(np.int32),反之亦然。
  • 最后一个问题返回我 int () with bae 10: '\ x1a' 的无效文字,如果我打印数据类型,所有在 for all 之前的行都是对象类型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 2013-12-02
  • 2017-03-25
相关资源
最近更新 更多