Python 来自numpy结构化阵列的熊猫DF:can';无法获取列(仅对象)的unicode或字符串类型
我从软件系统中提取数据,这给了我一个numpy结构的数组。我将其转换为pandas数据帧来完成工作,然后需要将其转换回结构化数组,以便将其推回到原始系统中。字符串/文本数据在数组中显示为unicode列,并在DF中描述为对象。我一直在试图找出如何在DF甚至是结束数组中将其恢复为unicode或字符串,但遇到了麻烦。为了只问一个问题,如何将DF列的数据类型设置为unicode/string 以下是我正在尝试的内容,“区域”一栏是我关注的重点:Python 来自numpy结构化阵列的熊猫DF:can';无法获取列(仅对象)的unicode或字符串类型,python,numpy,pandas,Python,Numpy,Pandas,我从软件系统中提取数据,这给了我一个numpy结构的数组。我将其转换为pandas数据帧来完成工作,然后需要将其转换回结构化数组,以便将其推回到原始系统中。字符串/文本数据在数组中显示为unicode列,并在DF中描述为对象。我一直在试图找出如何在DF甚至是结束数组中将其恢复为unicode或字符串,但遇到了麻烦。为了只问一个问题,如何将DF列的数据类型设置为unicode/string 以下是我正在尝试的内容,“区域”一栏是我关注的重点: import pandas as pd import
import pandas as pd
import numpy as np
arr = array([(1, u'01', 7733855, 0), (2, u'01', 7733919, 1244),
(3, u'01', 7732571, 1236), (4, u'01', 7732387, 1234),
(5, u'01', 7733327, 1239), (6, u'01', 7733755, 1241),
(7, u'01', 7732571, 1236), (8, u'01', 7733923, 0),
(9, u'01', 7733327, 1239), (10, u'01', 7733755, 1241)],
dtype=[('hru_id_nat', '<i4'), ('region', '<U255'), ('POI_ID', '<i4'), ('hru_segment', '<i4')])
显示“区域”有一个对象
数据类型:
hru_id_nat int32
region object
POI_ID int32
hru_segment int32
dtype: object
我尝试在转换为DF时指定数据类型,但没有完全得到:
n = list(arr.dtype.names)
t = [i[0].name for i in arr.dtype.fields.values()]
dt = [(i, j) for i, j in zip(n, t)]
dt
获取:
[('hru_id_nat', 'int32'),
('region', 'unicode8160'),
('POI_ID', 'int32'),
('hru_segment', 'int32')]
当我尝试使用dt规范创建DF时,这会抛出一个错误
df = pd.DataFrame(arr, dt)
如果我尝试以下方法,则没有帮助:
dt[1] = ('region', 'unicode')
dt[1] = ('region', 'str')
dt[1] = ('region', np.str)
我还尝试了convert_type()
(基于)和df['region']=df['region'].astype(np.str)
(基于),但两者似乎都没有改变df报告的数据类型
非常感谢您的帮助。查看文档 下面是我用来测试它的代码:
import pandas as pd
import numpy as np
arr = pd.DataFrame(data=[(1, u'01', 7733855, 0), (2, u'01', 7733919, 1244),
(3, u'01', 7732571, 1236), (4, u'01', 7732387, 1234),
(5, u'01', 7733327, 1239), (6, u'01', 7733755, 1241),
(7, u'01', 7732571, 1236), (8, u'01', 7733923, 0),
(9, u'01', 7733327, 1239), (10, u'01', 7733755, 1241)],)
print arr, '\n', arr.dtypes
arr = arr.astype('string')
arr = arr.astype('int')
print arr.values, '\n', arr.dtypes
输出是
astype为我工作。我的版本是python 2.7.6.0.13.1和numpy 1.8.2,请查看文档 下面是我用来测试它的代码:
import pandas as pd
import numpy as np
arr = pd.DataFrame(data=[(1, u'01', 7733855, 0), (2, u'01', 7733919, 1244),
(3, u'01', 7732571, 1236), (4, u'01', 7732387, 1234),
(5, u'01', 7733327, 1239), (6, u'01', 7733755, 1241),
(7, u'01', 7732571, 1236), (8, u'01', 7733923, 0),
(9, u'01', 7733327, 1239), (10, u'01', 7733755, 1241)],)
print arr, '\n', arr.dtypes
arr = arr.astype('string')
arr = arr.astype('int')
print arr.values, '\n', arr.dtypes
输出是
astype为我工作。我的版本是python 2.7.6.0.13.1和numpy 1.8.2,请查看文档 下面是我用来测试它的代码:
import pandas as pd
import numpy as np
arr = pd.DataFrame(data=[(1, u'01', 7733855, 0), (2, u'01', 7733919, 1244),
(3, u'01', 7732571, 1236), (4, u'01', 7732387, 1234),
(5, u'01', 7733327, 1239), (6, u'01', 7733755, 1241),
(7, u'01', 7732571, 1236), (8, u'01', 7733923, 0),
(9, u'01', 7733327, 1239), (10, u'01', 7733755, 1241)],)
print arr, '\n', arr.dtypes
arr = arr.astype('string')
arr = arr.astype('int')
print arr.values, '\n', arr.dtypes
输出是
astype为我工作。我的版本是python 2.7.6.0.13.1和numpy 1.8.2,请查看文档 下面是我用来测试它的代码:
import pandas as pd
import numpy as np
arr = pd.DataFrame(data=[(1, u'01', 7733855, 0), (2, u'01', 7733919, 1244),
(3, u'01', 7732571, 1236), (4, u'01', 7732387, 1234),
(5, u'01', 7733327, 1239), (6, u'01', 7733755, 1241),
(7, u'01', 7732571, 1236), (8, u'01', 7733923, 0),
(9, u'01', 7733327, 1239), (10, u'01', 7733755, 1241)],)
print arr, '\n', arr.dtypes
arr = arr.astype('string')
arr = arr.astype('int')
print arr.values, '\n', arr.dtypes
输出是
astype为我工作。我的版本是python 2.7.6.0.13.1和numpy 1.8.2,除非我误解了(这是完全可能的),否则我认为您有一个。。。。熊猫数据帧永远不会告诉您它有任何数据类型为“unicode”的数据。但您的unicode数据完全安全地存储为“对象”。所有字符串数据都存储为“对象”数据类型
从数据帧转换后返回unicode数据类型的问题应该不难。当我获取您的数据帧并使用to_records
方法将其转换时,我将您的字符串数据(“区域”)作为类型'O'
,这可能就是您所做的:
>>> a = df.to_records()
>>> a
rec.array([(0L, 1, u'01', 7733855, 0), (1L, 2, u'01', 7733919, 1244),
(2L, 3, u'01', 7732571, 1236), (3L, 4, u'01', 7732387, 1234),
(4L, 5, u'01', 7733327, 1239), (5L, 6, u'01', 7733755, 1241),
(6L, 7, u'01', 7732571, 1236), (7L, 8, u'01', 7733923, 0),
(8L, 9, u'01', 7733327, 1239), (9L, 10, u'01', 7733755, 1241)],
dtype=[('index', '<i8'), ('hru_id_nat', '<i4'), ('region', 'O'), ('POI_ID', '<i4'), ('hru_segment', '<i4')])
>a=df.to_记录()
>>>a
记录阵列([(0L,1,u'01',7733855,0),(1L,2,u'01',7733919,1244),
(2L,3,u'01',77325711236),(3L,4,u'01',77323871234),
(4L,5,u'01',7733327239),(5L,6,u'01',77337551241),
(6L,7,u'01',77325711236),(7L,8,u'01',7733923,0),
(8L,9,u'01',7733327239),(9L,10,u'01',77337551241)],
dtype=[('index',',除非我误解了(这完全有可能),否则我认为您在这里有一个…pandas数据帧不会告诉您它有任何数据类型为'unicode'。但是您的unicode数据完全安全地存储为'object'。所有字符串数据都存储为'object'数据类型
从数据帧转换后返回unicode数据类型的问题应该不难。当我获取您的数据帧并使用到_records
方法将其转换时,我将您的字符串数据(“区域”)作为类型'O'
,这可能是您所做的:
>>> a = df.to_records()
>>> a
rec.array([(0L, 1, u'01', 7733855, 0), (1L, 2, u'01', 7733919, 1244),
(2L, 3, u'01', 7732571, 1236), (3L, 4, u'01', 7732387, 1234),
(4L, 5, u'01', 7733327, 1239), (5L, 6, u'01', 7733755, 1241),
(6L, 7, u'01', 7732571, 1236), (7L, 8, u'01', 7733923, 0),
(8L, 9, u'01', 7733327, 1239), (9L, 10, u'01', 7733755, 1241)],
dtype=[('index', '<i8'), ('hru_id_nat', '<i4'), ('region', 'O'), ('POI_ID', '<i4'), ('hru_segment', '<i4')])
>a=df.to_记录()
>>>a
记录阵列([(0L,1,u'01',7733855,0),(1L,2,u'01',7733919,1244),
(2L,3,u'01',77325711236),(3L,4,u'01',77323871234),
(4L,5,u'01',7733327239),(5L,6,u'01',77337551241),
(6L,7,u'01',77325711236),(7L,8,u'01',7733923,0),
(8L,9,u'01',7733327239),(9L,10,u'01',77337551241)],
dtype=[('index',',除非我误解了(这完全有可能),否则我认为您在这里有一个…pandas数据帧不会告诉您它有任何数据类型为'unicode'。但是您的unicode数据完全安全地存储为'object'。所有字符串数据都存储为'object'数据类型
从数据帧转换后返回unicode数据类型的问题应该不难。当我获取您的数据帧并使用到_records
方法将其转换时,我将您的字符串数据(“区域”)作为类型'O'
,这可能是您所做的:
>>> a = df.to_records()
>>> a
rec.array([(0L, 1, u'01', 7733855, 0), (1L, 2, u'01', 7733919, 1244),
(2L, 3, u'01', 7732571, 1236), (3L, 4, u'01', 7732387, 1234),
(4L, 5, u'01', 7733327, 1239), (5L, 6, u'01', 7733755, 1241),
(6L, 7, u'01', 7732571, 1236), (7L, 8, u'01', 7733923, 0),
(8L, 9, u'01', 7733327, 1239), (9L, 10, u'01', 7733755, 1241)],
dtype=[('index', '<i8'), ('hru_id_nat', '<i4'), ('region', 'O'), ('POI_ID', '<i4'), ('hru_segment', '<i4')])
>a=df.to_记录()
>>>a
记录阵列([(0L,1,u'01',7733855,0),(1L,2,u'01',7733919,1244),
(2L,3,u'01',77325711236),(3L,4,u'01',77323871234),
(4L,5,u'01',7733327239),(5L,6,u'01',77337551241),
(6L,7,u'01',77325711236),(7L,8,u'01',7733923,0),
(8L,9,u'01',7733327239),(9L,10,u'01',77337551241)],
dtype=[('index',',除非我误解了(这完全有可能),否则我认为您在这里有一个…pandas数据帧不会告诉您它有任何数据类型为'unicode'。但是您的unicode数据完全安全地存储为'object'。所有字符串数据都存储为'object'数据类型
从数据帧转换后返回unicode数据类型的问题应该不难。当我获取您的数据帧并使用到_records
方法将其转换时,我将您的字符串数据(“区域”)作为类型'O'
,这可能是您所做的:
>>> a = df.to_records()
>>> a
rec.array([(0L, 1, u'01', 7733855, 0), (1L, 2, u'01', 7733919, 1244),
(2L, 3, u'01', 7732571, 1236), (3L, 4, u'01', 7732387, 1234),
(4L, 5, u'01', 7733327, 1239), (5L, 6, u'01', 7733755, 1241),
(6L, 7, u'01', 7732571, 1236), (7L, 8, u'01', 7733923, 0),
(8L, 9, u'01', 7733327, 1239), (9L, 10, u'01', 7733755, 1241)],
dtype=[('index', '<i8'), ('hru_id_nat', '<i4'), ('region', 'O'), ('POI_ID', '<i4'), ('hru_segment', '<i4')])
>a=df.to_记录()
>>>a
记录阵列([(0L,1,u'01',7733855,0),(1L,2,u'01',7733919,1244),
(2L,3,u'01',77325711236),(3L,4,u'01',77323871234),
(4L,5,u'01',7733327239),(5L,6,u'01',77337551241),
(6L,7,u'01',77325711236),(7L,8,u'01',7733923,0),
(8L,9,u'01',7733327239),(9L,10,u'01',77337551241)],
数据类型=[(“索引”,“澄清”