由于种种原因,DataFrame中会出现重复行。考虑下列DataFrame:
import pandas as pd
data = pd.DataFrame({'k1':['one','two'] * 3 + ['two'],
'k2:':[1,1,2,3,3,4,4]})
# 0 one 1
# 1 two 1
# 2 one 2
# 3 two 3
# 4 one 3
# 5 two 4
# 6 two 4
DataFrame中的duplicated方法返回的是一个布尔值Series,这个Series反应的是每一行是否与之前出现过的行相同:
print(data.duplicated())
# 0 False
# 1 False
# 2 False
# 3 False
# 4 False
# 5 False
# 6 True
# dtype: bool
而drop_duplicates返回的是DataFrame,内容是非重复的部分(即duplicated方法返回的值为False的部分):
print(data.drop_duplicates())
# k1 k2:
# 0 one 1
# 1 two 1
# 2 one 2
# 3 two 3
# 4 one 3
# 5 two 4
默认都是对列进行操作。可以指定数据的任何子集来检测是否有重复。现在我们为原来的DataFrame添加一列:
data['v1'] = range(7)
k1 k2: v1
# 0 one 1 0
# 1 two 1 1
# 2 one 2 2
# 3 two 3 3
# 4 one 3 4
# 5 two 4 5
# 6 two 4 6
可以基于某个特定的列来去除重复值:
print(data.drop_duplicates(['k1']))
# k1 k2: v1
# 0 one 1 0
# 1 two 1 1
默认保留的是第一个观测到的值。传入keep = 'last’将会返回最后一个。
我们可以对DataFrame中的数组、列或列中的数据进行转换。考虑下面的DataFrame:
import pandas as pd
data = pd.DataFrame({'food':['bacon','pulled porl','bacon',
'Pastrami','corned beef','Bacon',
'pastrami','honey ham','nova lox'],
'ounces':[4,3,12,6,7.5,8,3,5,6]})
# food ounces
# 0 bacon 4.0
# 1 pulled porl 3.0
# 2 bacon 12.0
# 3 Pastrami 6.0
# 4 corned beef 7.5
# 5 Bacon 8.0
# 6 pastrami 3.0
# 7 honey ham 5.0
# 8 nova lox 6.0
我先我们想将下列字典关联到上面的DataFrame中:
meat_to_animal = {
'bacon' : 'pig',
'pulled pork' : 'pig',
"pastrami" : 'cow',
"corned beef" : 'cow',
"honey ham" : 'pig',
'nova lox' : "salmin"
}
我们注意到上面的部分的食物名称为大写
我们可以使用以下方式进行关联:
new_columns = data['food'].map(lambda x:meat_to_animal[x.lower()])
#这里Series的lower方法是将大写字母变为小写字母,并以Series的形式返回
# 0 pig
# 1 pig
# 2 pig
# 3 cow
# 4 cow
# 5 pig
# 6 cow
# 7 pig
# 8 salmin
# Name: food, dtype: object
data['animal'] = new_columns
# food ounces animal
# 0 bacon 4.0 pig
# 1 pulled pork 3.0 pig
# 2 bacon 12.0 pig
# 3 Pastrami 6.0 cow
# 4 corned beef 7.5 cow
# 5 Bacon 8.0 pig
# 6 pastrami 3.0 cow
# 7 honey ham 5.0 pig
# 8 nova lox 6.0 salmon
考虑下面的Series:
data = pd.Series([1.,999.,2.,-999.,-1000.,3.])
# 0 1.0
# 1 999.0
# 2 2.0
# 3 -999.0
# 4 -1000.0
# 5 3.0
# dtype: float64
我们可能想要将某些值替换为其他值,比如将-999.替换为NA:
data.replace(-999.,np.nan)
# 0 1.0
# 1 999.0
# 2 2.0
# 3 NaN
# 4 -1000.0
# 5 3.0
# dtype: float64
我们也可以将多个值替换为某个值:
data.replace([-999,-1000.],np.nan
# 0 1.0
# 1 999.0
# 2 2.0
# 3 NaN
# 4 NaN
# 5 3.0
# dtype: float64
我们也可以将多个值替换为不同的值:
data.replace([-999,-1000.],[np.nan,0])
# 0 1.0
# 1 999.0
# 2 2.0
# 3 NaN
# 4 0.0
# 5 3.0
# dtype: float64
我们可以在不生成新的数据结构的情况下修改轴,考虑下面的这个数据结构:
import pandas as pd
import numpy as np
data = pd.DataFrame(np.arange(12).reshape((3,4)),
index = ['Ohio','Colorado','New York'],
columns = ['one','two','three','four'])
# one two three four
# Ohio 0 1 2 3
# Colorado 4 5 6 7
# New York 8 9 10 11
与Series类似,轴索引也有一个map方法:
transform_func = lambda x: x[:4].upper()
data.index = data.index = data.index.map(transform_func)
# one two three four
# OHIO 0 1 2 3
# COLO 4 5 6 7
# NEW 8 9 10 11
如果我们想要另外创建一个修改后的版本,并且不改变原来的数据集,那么我们可以使用rename方法:
data.rename(index = str.upper,columns = str.title)
# One Two Three Four
# OHIO 0 1 2 3
# COLORADO 4 5 6 7
# NEW YORK 8 9 10 11
如果我们想要修改原数据集可以传入参数‘inplace = True’。