>>> 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)})
> 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[行号,列号],但数据框不可这样查看数据,具体见下面
> data[0:2] #选取0、1行,左闭右开,该方法只能选取索引连续的行,不能用>>> data[[1,3]],注意:此方法显示行必须是有冒号
> data.loc[1] #第二行
> data.loc[1,:]
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.地市
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列
#整体
> 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()
data[data['v1']==2] #选取最外层括号内为true的行
data[data['v1'].isnull()]
> data=data.drop_duplicates('INTERFACE_NAME')
> data=data.drop_duplicates(['a','b'])
data.isnull() #返回true、false
#填充
> data=data.fillna(0) 等价于>>> wk.where(wk.notnull(),0)
> data=data.replace(旧值,新值) #也适用于非空值情况,替换值
#删除
> data=data.dropna(how='any') #括号里面可以缺省,删除含有空值的整行
#只填充某一列
> data['v1']=data['v1'].fillna(3)
#输出每列有多少个空值
> for i in data.columns:
> print(i,':',sum(data[i].isnull())) #等价于print(i,':',data[i].isnull().value_counts())
#删除某一列含有空值的行
> data[data['v1']==2]=10
> data.loc[data[data['v1']==4].index,'v1']=10
> data=data.rename(columns={'v1':'姓名'})
> data.columns=['A','B','C'] #此处需列出所有列名
> data=data.reset_index(drop=True)
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)
> data['v4']=[1,2,3]
> data=data.drop(1,axis=0) #axis=0可省略
> data=data.drop([0,1],axis=0)
> 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
data.groupby([‘列名1’,’列名2‘,…])
> dd=data.groupby('v1')
> [i for i in dd] #展示分组内容,注意分组后可能会将分组字段变成索引
> dd=data.groupby('v1',as_index=False) #分组后不将分组字段变成索引
> dd.size() #每个组有多少行
> dd.sum() #每个组除分组字段其余字段每行求和
> dd.count() #每个组除分组字段其余字段每行非空字段
data.groupby([‘列名1’,’列名2’,..].[‘列名1’,’列名2’,..].agg([‘maen’,’sum’])
> dd.agg('mean') #等价于上面的dd.sum()
> dd['v2'].agg('sum')
> dd['v2','v3'].agg(['mean','sum'])
data.groupby([‘列名1’,’列名2’,..].[‘列名1’,’列名2’,..].apply(np.mean)
> dd.apply(np.mean)
> dd['v1','v2'].apply(np.mean)
apply()不同于agg()的地方在于:前者应用于dataframe的各个列,后者仅作用于指定的列
按照指定的行和列统计分组频数(注意和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
data2=data.sort_index(ascending=True) #默认升序
> data2=data.sort_index()
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
pd.concat([表1,表2])
> data=pd.concat([data1,data2])
> data=pd.concat([data1,data2],keys=['x','y']) #要在相接的时候加上层次,来识别数据源自于哪张表,可以增加key参数
pd.merge(表1,表2,on=[‘字段1’,’字段2’],how=’inner/outer/left/right’)
> data=pd.merge(data1,data2,on='user_id',how='left')
> data[data['v1']>5]
> 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)
> 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)
> 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)
data[(条件1) & (条件2)] #注意小括号不能省
> data[(data['v1']>5) & (data['v2']>5)]
补充:
> 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)