数据框相关知识

一、新建

>>> wk=pd.DataFrame([[1,2,3],[2,np.NaN,4]],columns=['V1','v2','v3'])
>>> df = pd.DataFrame({'key1':['a','a','b','b','a'],'key2':['one','two','one','two','one'],'data1':np.random.randn(5),'data2':np.random.randn(5)})

二、查看数据

1、简单的dataframe查看

> len(data)      #查看行数
> data.shape     #行数和列数
> data.head(3)   #前三行 
> data.tail()    #最后五行
> data.index     #索引
> data.columns   #列名

> v=data.values    #数据框值
> type(v)
<class 'numpy.ndarray'>
> v[:,1]  
> data[:,1]  #会报错,数组可直接使用 wk[行号,列号],但数据框不可这样查看数据,具体见下面

2、数据选取

1)整行

> data[0:2]  #选取01行,左闭右开,该方法只能选取索引连续的行,不能用>>> data[[1,3]],注意:此方法显示行必须是有冒号

> data.loc[1] #第二行  
> data.loc[1,:]

2)整列

i、方法一:data[列名]

#只选取一列
> data['月份']  #等价于data[['月份']]

#选取多列
> data[['月份','地市']] #多列时将列名用大括号形成列表,注意和data[0:2]区别

ii、方法二:data.loc[:,列名]

> data.loc[:,'地市']

iii、方法三:data.iloc[:,列索引]

> data.iloc[:,0:4]  
> data.iloc[:,[0,2]]

iv、方法四:data.列名

> data.地市

3)行和列

i、方法一:data[列名][行索引]

#行索引只能是一行或者用冒号的连续行,不能是逗号隔开的不连续行
> data['地市'][0:1] #第一行,列名为地市的行
> data[['地市','月份']][0]

ii、方法二:data.loc[行索引,列名]

#冒号是左闭右闭
> data.loc[0:2,['月份','地市']]  #索引连续用冒号,不用大括号;索引为0、1、2的行,列名为月份、地市的3行2列数据;注意和data[0:2]区别,
> data.loc[[1,3],'月份']      #索引不连续,用大括号
> data.loc[[1,3],['月份','地市']]

iii、方法三:data.loc[行索引,列索引]

#冒号是左闭右开
> data.iloc[0,0]
> data.iloc[0:2,0]    #索引为0、1,第一列
> data.iloc[0:2,[0,2]]  #索引为0、1,第1、3列

3、查看某列值是否存在某些值

#整体
> f=[[1,2,3],[2,3,4]]
> data=pd.DataFrame(f,columns=['v1','v2','v3'])
> data.isin([2]) #返回true\false,注意小括号括号内为一个值也要用方括号
> data.isin([2,3])
#某一列
> data['v1'].isin([2])
#查看等于某些值的行索引,并转化为列表
> data[data['v2'].isin([3])==True].index.tolist()
##下面用法错误,返回的是所有行,并不是结果为true的行
> data.isin([3]).index.tolist()

4、选取满足条件的行

data[data['v1']==2] #选取最外层括号内为true的行
data[data['v1'].isnull()]

三、行去重

> data=data.drop_duplicates('INTERFACE_NAME')  
> data=data.drop_duplicates(['a','b']) 

四、空值

1、总览是否为空值

data.isnull()  #返回true、false

2、用m填充空值

1)全局情况

#填充
> data=data.fillna(0) 等价于>>> wk.where(wk.notnull(),0)
> data=data.replace(旧值,新值)     #也适用于非空值情况,替换值
#删除
> data=data.dropna(how='any') #括号里面可以缺省,删除含有空值的整行
#只填充某一列
> data['v1']=data['v1'].fillna(3)

2)针对某一列情况

#输出每列有多少个空值
> for i in data.columns:
>     print(i,':',sum(data[i].isnull())) #等价于print(i,':',data[i].isnull().value_counts())
#删除某一列含有空值的行

五、更改数值

1、重赋值

1)、将满足条件的整行都赋值

> data[data['v1']==2]=10

2)、将满足条件的该列重新赋值

> data.loc[data[data['v1']==4].index,'v1']=10

2、重命名

> data=data.rename(columns={'v1':'姓名'})
> data.columns=['A','B','C'] #此处需列出所有列名

3、重新设置索引

> data=data.reset_index(drop=True)

六、插入/删除行/列

1、新增行:

data.loc[行索引,:]=[…] (冒号可省略)
append(a,ignore_index=True)

> data.loc[2]=[0,1,2] #若是已经存在该行,则会覆盖
> s=pd.Series([1,2,3],index=['v1','v2','v3'])
> f.append(s,ignore_index=True)

2、新增列:data[列名]=[…]

> data['v4']=[1,2,3]

3、删除行:data.drop(行索引,axis=0)

> data=data.drop(1,axis=0)  #axis=0可省略
> data=data.drop([0,1],axis=0)

4、删除列

> data=data.drop('v1',axis=1)
> data=data.drop(['v2','v3'],axis=1)

> del data['v4'] #只能一列一列的删

七、统计分析

> data.describe() #统计每列的均值方差中位数等
> data.std()  #每列方差

八、分组

https://blog.csdn.net/elecjack/article/details/50760736

1、按列分组:

data.groupby([‘列名1’,’列名2‘,…])

> dd=data.groupby('v1')
> [i for i in dd]  #展示分组内容,注意分组后可能会将分组字段变成索引
> dd=data.groupby('v1'as_index=False) #分组后不将分组字段变成索引

2、分组后结果可用size()、sum()、count()等统计函数

> dd.size() #每个组有多少行
> dd.sum()  #每个组除分组字段其余字段每行求和
> dd.count() #每个组除分组字段其余字段每行非空字段

3、应用agg()

data.groupby([‘列名1’,’列名2’,..].[‘列名1’,’列名2’,..].agg([‘maen’,’sum’])

> dd.agg('mean')  #等价于上面的dd.sum()
> dd['v2'].agg('sum')
> dd['v2','v3'].agg(['mean','sum'])

4、应用apply()

data.groupby([‘列名1’,’列名2’,..].[‘列名1’,’列名2’,..].apply(np.mean)

> dd.apply(np.mean)
> dd['v1','v2'].apply(np.mean)

apply()不同于agg()的地方在于:前者应用于dataframe的各个列,后者仅作用于指定的列

5、交叉表crosstab

即频率表,两个字段值相应的数量关系

按照指定的行和列统计分组频数(注意和groupby不一样的地方)

> pd.crosstab(data.V1,data.v2,margins=True) #margins=True求合计,默认为False;若是有空值,默认忽略空值,此时可以将空值填充为0;必须有(V1、v2)两个参数

九、排序

https://blog.csdn.net/xu200yang/article/details/70239109
https://blog.csdn.net/lemonbit/article/details/73302532
https://blog.csdn.net/flyfrommath/article/details/77225733

1、按行索引排序

data2=data.sort_index(ascending=True) #默认升序

> data2=data.sort_index()

2、按列排序

data2=data.sort_values([‘列名1’,’列名2’,…],ascending=True)

> data2=data.sort_value('v1')
> data2=data.sort_value(by='v1')
> data2=data.sort_value(by=['v1','v2'])

十、表连接

https://blog.csdn.net/stevenkwong/article/details/52528616
https://blog.csdn.net/stevenkwong/article/details/52540605

1、相同字段表首尾相接

pd.concat([表1,表2])

> data=pd.concat([data1,data2])
> data=pd.concat([data1,data2],keys=['x','y']) #要在相接的时候加上层次,来识别数据源自于哪张表,可以增加key参数

2、字段不同表横向拼接

pd.merge(表1,表2,on=[‘字段1’,’字段2’],how=’inner/outer/left/right’)

> data=pd.merge(data1,data2,on='user_id',how='left')

十一、按照条件选取行

1、单个条件

> data[data['v1']>5]

2、多个条件

1)逻辑与:np.logical_and

> data[np.logical_and(data['v1']> 5,data['v2']>5)]
> np.logical_and(True,False)
False
> np.logical_and([True, False], [False, False])
array([False, False], dtype=bool)
> x = np.arange(5)
> np.logical_and(x>1, x<4)
array([False, False,  True,  True, False], dtype=bool)

2)逻辑或:np.logical_or

> np.logical_or(True, False)
True
> np.logical_or([True, False], [False, False])
array([ True, False], dtype=bool)
> x = np.arange(5)
> np.logical_or(x < 1, x > 3)
array([ True, False, False, False,  True], dtype=bool)

3)逻辑非:np.logical_not

> np.logical_not(3)
False
> np.logical_not([True, False, 0, 1])
array([False,  True,  True, False], dtype=bool)
> x = np.arange(5)
> np.logical_not(x<3)
array([False, False, False,  True,  True], dtype=bool)

4)&

data[(条件1) & (条件2)] #注意小括号不能省

> data[(data['v1']>5) & (data['v2']>5)]

补充:

https://blog.csdn.net/blackyuanc/article/details/77892784

> aa = np.array([1, 0, 1, 0])
> bb = pd.DataFrame(aa.T, columns=['one']) #生成一个ndarray,装要插入的值 
> two = np.zeros(bb.shape[0])
# 按条件修改two
for i in range(bb.shape[0]):
    if bb['one'][i] == 0:    #行列数据选取可以先列名再行号
        two[i] = 1
# 完成后将two插入dataframe中
bb.insert(1,'two', two)
print(bb)

你可能感兴趣的:(python,python,h)