【问题标题】:Edit type of column to fixed width string (within existing Pandas dataframe)将列类型编辑为固定宽度的字符串(在现有的 Pandas 数据框中)
【发布时间】: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 倍。

标签: python pandas


【解决方案1】:

你可以pop之前的栏目重新分配:

In [11]: df.dtypes
Out[11]:
c    object
dtype: object

In [12]: df['c'] = df.pop('c').astype('|S2')

In [13]: df.dtypes
Out[13]:
c    |S2
dtype: object

【讨论】:

  • 噢……嗯。对我来说不起作用(22.0)。我会尝试 24.0
  • 您使用的是哪个版本的熊猫。对于 0.22.0 和 0.24.0,我最终得到“c 对象”。
  • with: `df = pd.Series(np.array(['0', '200', '0', '200', '200', '0']), name= "c").to_frame() ; df['c'] = df.pop('c').astype('|S2') ;打印 df.dtypes`
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
  • 1970-01-01
  • 2019-03-02
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多