【发布时间】:2019-01-28 09:10:46
【问题描述】:
我在 pandas 数据框中有一列字符串对象。 我想将它们更改为效率较低的固定宽度字符串类型。
有很多 SO 答案 (How to set dtypes by column in pandas DataFrame) 详细说明了如何为数字类型执行此操作:
import pandas as pd
import numpy as np
df = pd.Series(["1", "22", "333", "4444", "55555"], name="c").to_frame()
df["c"] = df["c"].astype("int")
list(df.dtypes) # [dtype('int64')]
...但这对于固定宽度的字符串会失败:
df = pd.Series(["1", "22", "333", "4444", "55555"], name="c").to_frame()
df["c"] = df["c"].astype("|S2")
print list(df.dtypes) # [dtype('O')]
df["c"] 的内容应与以下内容相同:
print np.array(["1", "22", "333", "4444", "55555"]).astype("|S2")
['1' '22' '33' '44' '55']
那么.. 如何更改 DataFrame 列的 dtype? (不分配一个全新的数据框——只想改变那一列)
【问题讨论】:
-
是什么让您认为这是“非常低效”?我没有遵循问题的前提
-
你说“效率低下”,然后转换成数据不分青红皂白丢失的类型
-
当然——只是为了说明这个例子。用字符串固定(在我的情况下),使用更少的内存,因为字符串很短(比分配 PyObject 的开销要少得多),并且内存保持无碎片,并且可以在单个操作中有效地序列化和反序列化数据。
-
我不确定这是不是真的。如果您更改表示该列的底层数组的内存占用,它将不再具有相同的步幅,因此必须复制为连续的?
-
打印 getsizeof(np.array(["aaaa"] * 1000000, dtype="object")) 打印 getsizeof(np.array(["aaaa"] * 1000000, dtype="|S2 ")) 大小是(至少)4 倍。