Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 替换大型数据帧中无效值的高效内存解决方案?_Python_Pandas_Performance_Dataframe - Fatal编程技术网

Python 替换大型数据帧中无效值的高效内存解决方案?

Python 替换大型数据帧中无效值的高效内存解决方案?,python,pandas,performance,dataframe,Python,Pandas,Performance,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 Bo

这个问题是以下问题的继续:

假设我有以下数据帧:

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
讨论的替换这些值的解决方案是使用
强制
,或替换为子集数据框:

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

问题是对于具有数百万行的pandas数据帧,这些基于pandas的解决方案变得非常占用内存

在熊猫这样的情况下,最实际的解决方案是什么

我可以尝试使用
df[df['Age']!='#']
创建一个大型字典,其中
Name:Age
作为键值对。然后,逐行遍历原始数据帧;如果有一行的年龄==
#
,则根据字典中的键值对替换它。这样做的缺点是,for循环将花费很长时间


是否有其他性能更好的解决方案

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

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

假设“年龄”中的有效值排在第一位,这应该行得通。

d=df[df['Age']!=''.'''.'之后。设置索引('Name')['Age']
,与
df
相比,
d
消耗了多少内存?您是否尝试过这个方法,并且仍然面临问题?请告诉我@pnv让我知道check@coldspeed我一定会很快给你更新的!为延误道歉;我会回来的soon@jezrael是的,我明白了。。。我正在尝试微优化。在我最初的回答中(在另一篇文章中)有更多的活动部分,因为OP.ya并没有关注性能,所以有可能用某种方法来衡量它吗?喜欢
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