Python 使用numpy更新大型数据帧,其中

Python 使用numpy更新大型数据帧,其中,python,pandas,dataframe,numpy,Python,Pandas,Dataframe,Numpy,我有一个大的数据框,超过200万条记录和9列宽。我需要创建一列并用从另一列派生的数据填充它。这就是我目前所拥有的。我使用numpy“where”查询一列,如果它找到匹配的字符串,则更新另一列。 这里有很多这样的“where”语句,超过30个,但为了简单起见,我只举了一个例子 user_d["renamed"] = np.where(user_d.ActDescript.str.contains("Organise & Busin"), "

我有一个大的数据框,超过200万条记录和9列宽。我需要创建一列并用从另一列派生的数据填充它。这就是我目前所拥有的。我使用numpy“where”查询一列,如果它找到匹配的字符串,则更新另一列。 这里有很多这样的“where”语句,超过30个,但为了简单起见,我只举了一个例子

user_d["renamed"] = np.where(user_d.ActDescript.str.contains("Organise & Busin"), "Organisation & Business Name Search","Not Found")
这在一定程度上是可行的。我遇到的问题是,当我运行这些“where”函数时,会出现内存错误。起初,我认为我可以将“where”语句拆分为一次运行10次。 数据帧按照我的预期更新。 但是,当我通过同一数据帧运行下10条语句时,第一次运行的更新将被覆盖。 我正在寻找一个解决方案,在这个解决方案中,我可以将这些多个“where”语句作为一个完整的块来运行,而不会出现内存错误,或者在覆盖上一次更新的情况下一次运行10个语句

任何帮助都将不胜感激


谢谢

如果没有进一步的代码或信息,很难找出什么是基线问题。我最好的猜测是,正如AlexanderS在评论中所说,您正在现有列的基础上创建新列,这需要内存。 最重要的是,新列包含未进行内存优化的纯字符串。以下是规模和可能解决方案的比较:

import sys
import pandas as pd

# byte size: plain string
s = "Organisation & Business Name Search"
sys.getsizeof(s)
# 84

# byte size: boolean
sys.getsizeof(True)
# 28

# Worst -> Store categorical data, e.g. 2 kind of strings as plain strings.
df = pd.DataFrame({"col1": [s for x in range(1, 1000)]})
sys.getsizeof(df["col1"])
# 66.078

# Better -> Store categorical data, e.g. 2 kind of strings as Pandas Categorical.
df = pd.DataFrame({"col1": [s for x in range(1, 1000)]})
df["col1"] = pd.Categorical(df["col1"])
sys.getsizeof(df["col1"])
# 1.317

# Best -> Store categorical data, e.g. 2 kind of strings as boolean.
df = pd.DataFrame({"col1": [x >= 500 for x in range(1, 1000)]})
sys.getsizeof(df["col1"])
# 1.143
如果其他“where”条件将新列作为字符串,则可以将它们转换为如下数据类型:
user_d[“重命名”]=user_d[“重命名”]。astype('category')
category后台数据类型将strint值转换为整数,从而减少内存使用。