2017-07-26 46 views
1

我有像在熊猫数据帧下列许多列中的数据:在整个数据帧蟒同时更换多个值

col1| col2| ...| col99 |col100 
MBs| Gigabytes|...| MBs| |MBs 
Megabytes| GBs|...|Megabytes |Gigabytes 
GB | Megabytes| ...|Gigabytes|Gigabytes 
GBs | GB  |... |MBs |Gigabytes 
Gigabytes|Megabytes|...|Gigabytes |Megabytes 

我也有它映射类似值的字典。例如,

mapping = {'Megabytes':'MB', 'Gigabytes':'GB', 'MBs':'MB','GBs':'GB', 'GB':'GB',} 

我想用字典中的映射值替换列中的每个值。目前我正在尝试做这样的事情,但得到一个错误。预期的输出应该是

col1|col2|...|col99|col100 
MB| GB|...| MB| |MB 
MB|GB|...|MB|GB 
GB |MB|...|GB|GB 
GB|GB|...|MB|GB 
GB|MB|...|GB|MB 

# My current implementation 
df = df.apply(lambda x: x.astype(str).replace('GBs', 'GB').replace('MBs', 'MB').replace('Megabytes', 'MB').replace('Gigabytes', 'GB')) 

有人能指导我一个正确和快速的方式做到这一点吗?

+0

正在__all__你的列是'object'(串)D型列? – MaxU

回答

2

试试这个:

df.loc[:, df.dtypes=='object'] = df.select_dtypes(['object']).replace(mapping, regex=True) 

这将适用mappingstring


如果所有你列的字符串(object)D型:

df = df.replace(mapping, regex=True) 

或者作为@JohnGal T已经提出了意见:

df = df.applymap(lambda x: mapping[x]) 
+0

我会使用替换。 'df.applymap(lambda x:mapping [x])'是另一种选择,假设所有值都有映射。 – Zero

+0

@JohnGalt,是的,我们也可以使用'.applymap()':)实际上,在最后一个Pandas版本中,它的速度更快 - 过去速度更慢... – MaxU

+2

我发誓如果我回去并重新提出合适的问题,你会有一个金徽章来替换' – piRSquared

3

pd.DataFrame.replace可以采取词典的词典,其中按键的第一级指定列替换时应用价值。

我们可以使用字典解析来过滤只有那些dtype == object

df.replace({c: mapping for c in df if df[c].dtype == object}) 

    col1 col2 col99 col100 
0 MB GB MB  MB 
1 MB GB MB  GB 
2 GB MB GB  GB 
3 GB GB MB  GB 
4 GB MB GB  MB