此问题是以下内容的延续:How to replace certain rows by shared column values in pandas DataFrame?
假设我有以下熊猫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为替换所讨论的这些值而讨论的熊猫解决方案是使用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)问题是对于拥有数百万行的熊猫DataFrame来说,这些基于熊猫的解决方案变得非常内存密集。
在这种情况下,对熊猫来说,最实际的解决方案是什么?
我可以尝试使用df[df['Age']!='#']创建一个庞大的字典,以Name: Age作为键值对。然后,逐行遍历原始的熊猫DataFrame;如果有带有Age==#的行,则根据字典中的键值对替换它。这样做的缺点是,换循环将花费永远的时间。
还有其他更好的解决方案吗?
发布于 2018-12-05 13:17:44
如果你尝试一些内存效率更高的东西,比如基于字典的替换,而不是基于系列的替换呢?
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假设“年龄”中的有效值是第一位的,这应该是可行的。
https://stackoverflow.com/questions/53633043
复制相似问题