【问题标题】:Memory efficient solution to replace invalid values in a large DataFrame?替换大型 DataFrame 中的无效值的内存高效解决方案?
【发布时间】:2019-05-07 01:35:27
【问题描述】:

这个问题是以下问题的延续: How to replace certain rows by shared column values in pandas DataFrame?

假设我有以下 pandas DataFrame:

import pandas as pd

data = [['Alex',10],['Bob',12],['Clarke',13], ['Bob', '#'], ['Bob', '#'], ['Bob', '#'], ['Clarke', '#']]

df = pd.DataFrame(data,columns=['Name','Age'], dtype=float)

     Name Age
0    Alex  10
1     Bob  12
2  Clarke  13
3     Bob   #
4     Bob   #
5     Bob   #
6  Clarke   #

第 3-6 行的值无效,字符串 #。这些应替换为有效值,输出:

     Name Age
0    Alex  10
1     Bob  12
2  Clarke  13
3     Bob  12
4     Bob  12
5     Bob  12
6  Clarke  13

讨论替换这些值的 pandas 解决方案是使用 coerce,或替换为子集数据框:

v = df.assign(Age=pd.to_numeric(df['Age'], errors='coerce')).dropna()
df['Age'] = df['Name'].map(v.set_index('Name').Age) 

d= df[df['Age']!='#'].set_index('Name')['Age']
df['Age']=df['Name'].replace(d)

问题在于具有数百万行的 pandas DataFrame,这些基于 pandas 的解决方案变得非常占用内存。

在类似熊猫的情况下,最实用的解决方案是什么?

我可以尝试使用df[df['Age']!='#'] 创建一个庞大的字典,并使用Name: Age 作为键值对。然后,逐行遍历原来的pandas DataFrame;如果存在 Age==# 的行,则根据字典中的键值对替换。这样做的缺点是,for 循环将永远持续下去。

还有其他性能更好的解决方案吗?

【问题讨论】:

  • d= df[df['Age']!='#'].set_index('Name')['Age'] 之后,d 消耗了多少内存,与df 相比?
  • 如果您尝试过此操作但仍然遇到问题,请告诉我?
  • @pnv 让我检查一下
  • @coldspeed 我一定会尽快为您更新!对延误表示歉意;我很快就会回来

标签: python pandas performance dataframe


【解决方案1】:

如果您尝试一些更节省内存的方法,例如基于字典的替换而不是基于序列的替换,会怎样?

mapping = dict(df.drop_duplicates('Name', keep='first').values)
df['Age'] = df['Name'].map(mapping)

print(df)
     Name  Age
0    Alex   10
1     Bob   12
2  Clarke   13
3     Bob   12
4     Bob   12
5     Bob   12
6  Clarke   13

另一种选择是使用列表推导:

mapping = dict(df.drop_duplicates('Name', keep='first').values)
df['Age'] = [mapping.get(x, np.nan) for x in df['Name']]

print(df)
     Name  Age
0    Alex   10
1     Bob   12
2  Clarke   13
3     Bob   12
4     Bob   12
5     Bob   12
6  Clarke   13

假设“年龄”中的有效值在前,这应该可以工作。

【讨论】:

  • @jezrael 是的,我明白了...我正在尝试在这里进行微优化。我最初的答案(在另一篇文章中)中有更多的移动部分,因为 OP 没有关注性能。
  • 是的,有可能以某种方式测量它吗?喜欢memory_usage ?
猜你喜欢
  • 2010-09-24
  • 2021-03-17
  • 2011-10-28
  • 2015-09-12
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多