我在pandas dataframe中有许多列中的数据,如下所示:
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',}
我想用dict中的映射值替换列中的每个值。目前我正在尝试做这样的事情,但收到错误。预期的输出应该是
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 :(得分: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
答案 1 :(得分:2)
试试这个:
df.loc[:, df.dtypes=='object'] = df.select_dtypes(['object']).replace(mapping, regex=True)
这仅适用于mapping
列
string
如果所有您的列都是字符串(object
)dtype:
df = df.replace(mapping, regex=True)
或@JohnGalt在评论中提出:
df = df.applymap(lambda x: mapping[x])