详解pandas映射与数据转换
在数据处理过程中,数据映射和数据转换是比较常见的操作。在pandas中,提供了许多方法来实现数据映射和数据转换。下面,我们就来详细讲解一下。
数据映射
pandas中的数据映射可以通过map、apply和applymap等方法实现。这些方法可以根据指定的规则将数据序列中的每个值映射到另一个值。其中,map方法是用于Series类型数据的映射,apply是用于DataFrame类型数据的行或列的映射,applymap是用于DataFrame类型数据中每个元素的映射。
map方法的使用
map方法可以接收字典、Series等类型作为参数,实现将指定数据序列中的每个值映射到另一个值的操作。
例如,我们有如下一个Series类型的数据:
import pandas as pd
s = pd.Series(['apple', 'banana', 'cat', 'dog'])
现在,我们想将其中的apple、banana替换为A、B,将cat、dog替换为C、D。可以通过如下代码实现:
s.map({'apple': 'A', 'banana': 'B', 'cat': 'C', 'dog': 'D'})
上面的代码中,map方法接收了一个字典类型作为参数,其中每个键值对表示一个映射关系。
apply方法的使用
apply方法可以根据指定的函数将DataFrame中的行或列进行映射操作。例如,我们有如下一个DataFrame类型的数据:
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
现在,我们定义一个函数,将A列中的值乘以2,将B列中的值乘以3。可以通过如下代码实现:
def func(x):
x['A'] *= 2
x['B'] *= 3
return x
df.apply(func, axis=1)
上面的代码中,apply方法接收了一个函数作为参数,该函数接收一个参数x,表示DataFrame中的一行或一列。在函数中,我们根据定义好的规则对x进行了修改,并返回修改后的结果。最后,使用apply方法将函数应用到DataFrame中的每一行数据,实现了映射操作。
applymap方法的使用
applymap方法可以对DataFrame中的每个元素进行映射操作。例如,我们有如下一个DataFrame类型的数据:
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
现在,我们定义一个函数,将每个元素都乘以2。可以通过如下代码实现:
def func(x):
return x * 2
df.applymap(func)
上面的代码中,applymap方法接收了一个函数作为参数,该函数接收一个参数x,表示DataFrame中的一个元素。在函数中,我们根据定义好的规则对x进行了修改,并返回修改后的结果。最后,使用applymap方法将函数应用到DataFrame中的每一个元素,实现了映射操作。
数据转换
pandas中的数据转换可以通过rename、sort_values、drop等方法实现。这些方法可以根据指定的规则实现对DataFrame的数据进行转换。
rename方法的使用
rename方法可以根据指定的规则对DataFrame的行或列进行重命名操作。例如,我们有如下一个DataFrame类型的数据:
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
现在,我们想把A列改为a,把B列改为b,可以通过如下代码实现:
df.rename(columns={'A': 'a', 'B': 'b'})
上面的代码中,rename方法接收了一个字典类型作为参数,其中每个键值对表示一个重命名关系。
sort_values方法的使用
sort_values方法可以根据指定的规则对DataFrame中的数据进行排序。例如,我们有如下一个DataFrame类型的数据:
df = pd.DataFrame({'A': [3, 2, 1], 'B': [6, 4, 5]})
现在,我们想按照A列的值进行升序排序,可以通过如下代码实现:
df.sort_values('A')
上面的代码中,sort_values方法接收了一个字符串类型的参数,表示按照哪个列进行排序。
drop方法的使用
drop方法可以根据指定的规则删除DataFrame中的某些行或列。例如,我们有如下一个DataFrame类型的数据:
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})
现在,我们想删除第一行和第二列,可以通过如下代码实现:
df.drop([0], inplace=True)
df.drop(['B'], axis=1, inplace=True)
上面的代码中,drop方法接收一个参数,表示要删除的行或列的标签。其中,inplace参数表示是否对原始数据进行修改。True表示对原始数据进行修改,False表示不修改原始数据。如果不指定该参数,默认为False。
示例说明
示例一:对上海市天气数据进行映射和转换
首先,我们获取上海市的天气数据:
import pandas as pd
url = 'https://raw.githubusercontent.com/jackandsnow/SHWeather/master/weather_notes.csv'
df = pd.read_csv(url, encoding='utf-8')
现在,我们来实现一些映射和转换操作。
示例一.1:使用map方法替换数据
数据中的“风向”列中有一些特殊的值,例如“微风”、“和风”等。我们想将这些特殊值统一换成“无风向”,可以使用如下代码:
df['风向'] = df['风向'].map({'无持续风向': '无风向', '微风': '无风向', '和风': '无风向'})
上面的代码中,我们将原始数据中的“无持续风向”、“微风”、“和风”三个值都替换成了“无风向”。
示例一.2:使用apply方法添加新列
我们想在原始数据中添加一列“温度类型”,表示温度的种类。例如,当温度小于15度时,温度类型为“寒冷”;当温度大于等于15度小于25度时,温度类型为“舒适”;当温度大于等于25度时,温度类型为“炎热”。可以使用如下代码:
def temp_type(row):
if row['温度'] < 15:
return '寒冷'
elif row['温度'] < 25:
return '舒适'
else:
return '炎热'
df['温度类型'] = df.apply(temp_type, axis=1)
上面的代码中,我们使用了apply方法将自定义的函数temp_type应用到每一行数据中,计算出每行数据的“温度类型”并添加到原始数据中。
示例二:对随机生成的数字进行排序和删除操作
我们随机生成100个数字并将其转换为DataFrame格式:
import pandas as pd
import numpy as np
np.random.seed(123)
data = np.random.randint(1, 101, 100)
df = pd.DataFrame(data, columns=['number'])
我们现在对数据进行排序和删除操作。
示例二.1:使用sort_values方法对数字进行排序
我们想按照“number”列的值对数据进行降序排序,可以使用如下代码:
df.sort_values(by='number', ascending=False, inplace=True)
上面的代码中,我们使用了sort_values方法对DataFrame中的数据按照“number”列的值进行了降序排序,结果保存在原始数据中。
示例二.2:使用drop方法删除部分数据
我们想删除“number”列中的前十个数字和最后一个数字,可以使用如下代码:
df.drop(df.index[:10], inplace=True)
df.drop(df.index[-1], inplace=True)
上面的代码中,我们使用了drop方法将DataFrame中的前十个(即0~9)和最后一个(即99)数据删除,在原始数据中进行修改。