【发布时间】: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