pandas 在赋值过程中指定框架列dtype

sigwle7e  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(93)

在pandas中,可以在赋值过程中设置列的dtype吗?什么工作是改变它之后,例如。

df["file"] = file
df["file"] = df["file"].astype("category")

然而,我有一些大型的嵌套框架,其中这个file列几乎不适合内存,但作为categorical dtype更容易适合。如果我在赋值的时候就把它们声明为无条件的,那会很方便。我想象的是

df.add_column(name="file", data=file, dtype="category")

这可能吗?

ukxgm1gy

ukxgm1gy1#

假设file是一个可迭代对象,你可以传递一个Series:

df = pd.DataFrame({'col': range(7)})
file = ['A', 'B', 'C', 'A', 'A', 'B', 'C']

df['file'] = pd.Series(file, index=df.index, dtype='category')

   col file
0    0    A
1    1    B
2    2    C
3    3    A
4    4    A
5    5    B
6    6    C

如果file是一个字符串:

df = pd.DataFrame({'col': range(7)})
file = 'filename'

df['file'] = pd.Series(file, index=df.index, dtype='category')

   col      file
0    0  filename
1    1  filename
2    2  filename
3    3  filename
4    4  filename
5    5  filename
6    6  filename

数据类型:

# df.dtypes

col        int64
file    category
dtype: object

concat之前使用分类

如果你的目标是concat,那么你必须使用一个同构的CategoricalDtype

df1 = pd.DataFrame({'col': range(7)})
df2 = pd.DataFrame({'col': range(7)})

dfs = [df1, df2]
files = ['filename1', 'filename2']

myfiles_cat = pd.CategoricalDtype(categories=files)

for df, f in zip(dfs, files):
    df['file'] = pd.Series(f, index=df1.index, dtype=myfiles_cat)

out = pd.concat(dfs)

print(out.dtypes)

输出量:

col        int64
file    category
dtype: object
nzk0hqpo

nzk0hqpo2#

可以直接使用pd.Categorical

# From @mozway
df = pd.DataFrame({'col': range(7)})
file = ['A', 'B', 'C', 'A', 'A', 'B', 'C']

df['file'] = pd.Categorical(file)

输出量:

>>> df.dtypes
col        int64
file    category
dtype: object

如何处理Categorical Data

相关问题