数据的添加、修正与删去
原始数据
import pandas as pd
data = [[110,123,132],[98,88,97],[101,102,103],[110,121,109]]
index = ['阿岳','阿乔','阿萧','阿蓝']
columns = ['语文','数学','英语']
df = pd.DataFrame(data=data,index=index,columns=columns)
print(df)
添加数据
DataFrame方针添加首要包含列数据添加和行数据添加。
按列添加数据
按列添加数据首要用三种办法进行完成:
- 直接为DataFrame进行赋值
- 运用loc特点在DataFrame方针的最终添加一列
- 在指定方位插入一列 insert进行完成
import pandas as pd
data = [[110,123,132],[98,88,97],[101,102,103],[110,121,109]]
index = ['阿岳','阿乔','阿萧','阿蓝']
columns = ['语文','数学','英语']
pd.set_option('display.unicode.east_asian_width',True)
df = pd.DataFrame(data=data,index=index,columns=columns)
# print(df)
#添加一列物理成果
df['物理']=[88,99,100,110]
print(df)
# 运用loc特点进行添加一列化学成果
df.loc[:,'化学']=[100,110,120,124.5] #注意:小数点会保持一致,所以相当于新增的是[100.0,110.0,120.0,124.5]
print(df)
# 在指定方位插入一列生物成果
df.insert(2,'生物',[121,131,141,145]) #注意:是在列索引为2的方位新增而不是替换
print(df)
按行添加数据
按行添加数据首要用两种办法进行完成:
1、添加单行数据 首要用loc特点进行完成
2、添加多行数据
import pandas as pd
# 处理数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width',True)
data = [[110,123,132],[98,88,97],[101,102,103],[110,121,109]]
index = ['阿岳','阿乔','阿萧','阿蓝']
columns = ['语文','数学','英语']
df = pd.DataFrame(data=data,index=index,columns=columns)
# print(df)
# 添加单行
df.loc['阿飞']=[100,120,130]
print(df)
# 添加多行
df_add=pd.DataFrame(
{
'语文':[100,123,108],
'数学':[101,113,103],
'英语':[102,114,119]
},index=['阿星','阿薇','阿慧']
)
new_df=pd.concat([df_add,df])
print(new_df)
修正数据
修正数据包含行、列标题与数据的修正。
修正列标题
修正列标题首要用两种办法进行完成:
1、修正列标题首要用到DataFrame方针的cloumns特点,直接赋值即可。
2、rename()办法进队伍标题的修正。
import pandas as pd
# 处理数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width',True)
data = [[110,123,132],[98,88,97],[101,102,103],[110,121,109]]
index = ['阿岳','阿乔','阿萧','阿蓝']
columns = ['语文','数学','英语']
df = pd.DataFrame(data=data,index=index,columns=columns)
# print(df)
# 修正单个 需求将一切的标题都写上,这样比较繁琐
df.columns=['语文','数学一','英语']
print(df)
# 用字典指定进行修正即可 指定inplace为True修正的时原df方针 不指定则回来修正后的新df
df.rename(columns={'语文':'语文一'},inplace=True)
print(df)
# 修正多个值
df.rename(columns={'语文':'语文一','数学':'数学一'},inplace=True)
print(df)
修正行标题
修正行标题首要用两种办法进行完成:
1、修正行标题首要用到DataFrame方针的index特点,直接赋值即可。
2、rename()办法进队伍标题的修正。
import pandas as pd
# 处理数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width',True)
data = [[110,123,132],[98,88,97],[101,102,103],[110,121,109]]
index = ['阿岳','阿乔','阿萧','阿蓝']
columns = ['语文','数学','英语']
df = pd.DataFrame(data=data,index=index,columns=columns)
# print(df)
df.index=[1,2,3,4]
print(df)
# 用字典指定进行修正即可 指定inplace为True修正的时原df方针 不指定则回来修正后的新df
df.rename(index={'阿岳':'Peric'},inplace=True)
print(df)
# 修正多个值
df.rename(index={'阿岳':'Peric','阿乔':'Parry','阿蓝':'Anna'},inplace=True)
print(df)
修正数据
修正数据首要用到DataFrame方针中的loc特点和iloc特点。
import pandas as pd
# 处理数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width',True)
data = [[110,123,132],[98,88,97],[101,102,103],[110,121,109]]
index = ['阿岳','阿乔','阿萧','阿蓝']
columns = ['语文','数学','英语']
df = pd.DataFrame(data=data,index=index,columns=columns)
# print(df)
# 修正整行数据
df.loc['阿岳']=[120,134,145]
print(df)
# 修正整列数据
df.loc[:,'语文']=[111,99,102,111]
print(df)
# 修正某一数据
df.loc['阿岳','英语']=150
print(df)
# 运用iloc 特点修正数据
df.iloc[0,0] = 111
print(df)
df.iloc[:,0] = [111,112,113,114]
print(df)
df.iloc[0,:] = [123,124,125]
print(df)
删去数据
删去数据首要用的是DataFrame方针中的drop()办法。 语法如下:
drop(labels, axis=0, level=None, inplace=False, errors='raise')
常用参数阐明:
labels
: 表明行标签或者列标签
axis
:指定依照行进行删去,还是依照列进行删去,假如设置为0,那么则删去行,假如为1,则删去列。0行1列
index
:index是依照行删去时传入的参数,需求传入的是一个列表,包含待删去行的索引编号。
inplace
:可选参数,对原数组做出修正并回来一个新数组。默认值为false,假如值为true,那么原数组直接就被替换。
columns
:columns是依照列删去时的参数,同样传入的是一个列表,包含需求删去列的称号。
import pandas as pd
# 处理数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width',True)
data = [[110,123,132],[98,88,97],[101,102,103],[110,121,109]]
index = ['阿岳','阿乔','阿萧','阿蓝']
columns = ['语文','数学','英语']
df = pd.DataFrame(data=data,index=index,columns=columns)
# print(df)
df.drop(labels='数学',axis=1,inplace=True) # 删去列标签为数学的列 #df.drop(columns=['数学'],inplace=True)
print(df)
df.drop(columns=['数学','语文'],inplace=True) # 删去column为数学和语文的列
print(df)
df.drop(['阿岳'],axis=0,inplace=True) # 删去某行 #df.drop(labels='阿岳',axis=0,inplace=True)
print(df)
df.drop(index='阿乔',axis=0,inplace=True) # 删去index为阿乔的某行
print(df)
删去特定条件的行
删去特点条件的行,首先找到满意该条件的行索引,然后再运用drop()办法将其删去。
df.drop(labels='阿萧',axis=0,inplace=True) # 删去行标签为阿萧的行
print(df)
数据清洗
缺失值查找与处理
首先要找到缺失值,首要运用DataFrame方针的info()办法
import pandas as pd
# 处理数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_excel('TB2018.xls')
# print(df)
# print(df.info()) #显示归纳数据
# 判别数据是否存在缺失值 还能够运用isnull()和notnull()办法
"""
isnull():
缺失值回来True 非缺失值回来False
notnull():
缺失值回来False 非缺失值回来True
"""
print(df.isnull)
print(df.notnull)
缺失值删去处理
经过前面的判别得知数据缺失状况,下面将缺失值删去,首要运用dropna()办法,该办法用于删去含有缺失值的行,首要代码如下:
import pandas as pd
# 处理数据输出时列名不对齐的问题
# pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_excel('TB2018.xls')
print(df)
# print(df.info())
new_df = df.dropna()
print(new_df)
缺失值填充处理
关于缺失数据,假如比例高于30%能够选择放弃这个指标,做删去处理,低于30%的尽量不要删去,而是选择将这部分数据进行填充,一般以0、众数、均值进行填充。DataFrame方针中的fillna()函数能够完成填充缺失数据,pad/ffill表明用前一个非缺失值去填充该缺失值,backffill/bfill表明用下一个非缺失值填充该缺失值。
import pandas as pd
# 处理数据输出时列名不对齐的问题
# pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_excel('TB2018.xls')
print(df)
# print(df.info())
df['宝物总数量'] = df['宝物总数量'].fillna(0)
#df['宝物总数量'] = df['宝物总数量'].ffill() 前一个非缺失值填充
#df['宝物总数量'] = df['宝物总数量'].bfill() 后一个非缺失值填充
print(df)
重复值处理
关于数据中存在的重复数据,包含重复的行或者几行中某一列的值重复一般做删去处理,首要运用dataFrame方针的drop_duplicates()办法。
df.drop_duplicates(subset=['A','B','C'],keep='first',inplace=True)
参数阐明如下:
- subset:表明要进去重的列名,默以为 None。
- keep:有三个可选参数,分别是 first、last、False,默以为 first,表明只保存第一次呈现的重复项,删去其余重复项,last 表明只保存最终一次呈现的重复项,False 则表明删去一切重复项。
- inplace:布尔值参数,默以为 False 表明删去重复项后回来一个副本,若为 Ture 则表明直接在原数据上删去重复项。
import pandas as pd
# 处理数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_excel('1月.xlsx')
print(df)
# 判读每一行数据是否相同
print(df.duplicated()) #不同回来False
# 去除悉数的重复数据
df.drop_duplicates()
print(df)
# 去除指定列的重复数据
new_df= df.drop_duplicates(['宝物标题'])
print(new_df)
# 保存重复行中的最终一行
df2 = df.drop_duplicates(['宝物标题'],keep='last')
print(df2)
# 直接删去,保存一个副本
df.drop_duplicates(['收货人姓名'],inplace=True) #默以为 False 表明删去重复项后回来一个副本,若为 Ture 则表明直接在原数据上删去重复项。
print(df)
索引的效果
索引的效果相当于图书的目录,能够依据目录中的页码快速找到所需的内容。pandas索引的效果如下:
1、更便利的查询数据
2、运用索引能够提升查询功能 假如索引是仅有的,pandas会运用哈希表优化,查找数据的时刻复杂度为O(i)。 假如索引不是仅有的,但是有序,pandas会依据二分查找法,查找数据的时刻复杂度为O(logN)。 假如索引是完全随机的,那么每次查询都要扫描数据表,查找数据的时刻复杂度为O(N)。
3、主动的数据对齐功能。
4、强大的数据结构: 根据分类数的索引,提升功能。 多维索引,用于groupby多维聚合成果等。 时刻类型索引,强大的日期和时刻的办法支撑。
import pandas as pd
s1 = pd.Series([10,20,30],index=list('abc'))
print(s1)
s2 =pd.Series([2,3,4],index=list('bcd'))
print(s2)
print(s1 s2)
从头设置索引
pandas有一个很重要的办法是reindex(),它的效果是创立一盒适应新索引的新方针。语法如下:
DataFrame.reindex(labels=None, index=None, columns=None, axis=None, method=None, copy=True, level=None, fill_value=nan, limit=None, tolerance=None)
参数如下:
labels : 新的标签/索引,以契合’axis’所指定的axis。
index, columns : 新的标签/索引要契合。最好是一个索引方针,以防止重复的数据
axis : axis的方针。能够是axis的称号(’索引’、’列’)或数字(0、1)。
method: {None, ‘backfill’/’bfill’, ‘pad’/’ffill’, ‘nearest’}, optional
copy : 回来一个新的方针,即便经过的索引是相同的。
level : 跨层广播,与经过的MultiIndex层的索引值相匹配。
fill_value : 在核算前用这个值填充现有的缺失(NaN)值,以及成功的DataFrame对齐所需的任何新元素。假如两个对应的DataFrame方位的数据都缺失,成果将是缺失。
limit : 向前或向后填充的最大接连元素数
tolerance : 不精确匹配的原始和新标签之间的最大间隔。匹配方位的索引值最能满意方程式abs(index[indexer] – target) <= tolerance。
回来 : reindexed : DataFrame
对Series方针从头设置索引
import pandas as pd
s1 = pd.Series([88, 77, 66], index=[1, 2, 3])
print(s1)
print(s1.reindex([1,2,3,4,5]))
print(s1.reindex([1,2,3,4,5],fill_value=0))
对dataframe方针从头设置索引
import pandas as pd
data = [[110,105,99],[105,88,115],[109,120,130]]
index=['mr001','mr003','mr005']
columns = ['语文','数学','英语']
df = pd.DataFrame(data=data, index=index,columns=columns)
print(df)
#经过reindex()办法从头设置行索引、列索引和队伍索引
print(df.reindex(['mr001','mr002','mr003','mr004','mr005'])) #①
print(df.reindex(columns=['语文','物理','数学','英语']))
print(df.reindex(index=['mr001','mr002','mr003','mr004','mr005'],columns=['语文','物理','数学','英语']))
①的输出:
注意:从头设置行索引/列索引之后,由于没有数据,所以会显示空格。
设置某列为行索引
设置某列为行索引首要运用set_index()办法
import pandas as pd
pd.set_option('display.unicode.east_asian_width', True)
df=pd.read_excel('1月.xlsx')
df1=df.head()
print(df1)
#设置“买家会员名”为行索引
df=df.set_index(['买家会员名'])
df2=df.head()
print(df2)
数据清洗后从头设置接连的行索引
在对Dataframe方针进行数据清洗后,例如去掉含有NaN的行之后,发现行索引还是原来的行索引。
假如要从头设置索引能够运用reset_index()办法,在删去的确数据后从头设置索引,首要代码如下:
import pandas as pd
df=pd.read_excel('TB2018.xls')
print(df)
df1=df.dropna()
print(df1) # 删去含有空格的行,剩余025689
df2=df.dropna().reset_index(drop=True)
print(df2) # 对剩余的行从头赋予行索引:012345