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