#数据概览
df.info()
df.describe()
#数据查看
df.head() #查看表头
df.shape() #查看行列
df.dtypes #查看数据类型
df["user_age_level"].hist() #查看变量分布
df.isnull().sum() #查看每一列缺失值情况
df['n_null'] = df.isnull().sum(axis=1) #查看每一行缺失值情况
df["user_age_level"].value_counts() #查看这一列的值统计
df['user_age_level'].unique() #查看数据取值
for feature in df.columns:
df.loc[df[feature]==-1,feature]=np.nan
#缺失值填充
mode_df=df.fillna(df.mode().iloc[0],inplace=True)
middf_=df.fillna(df.median())
df["user_age_level"][df.age.isnull()]="0" #对某一列填充
#众数填充
df.fillna(df.mode().iloc[0])
df.mode()
参数:
axis : {0 or ‘index’, 1 or ‘columns’}, default 0
0 or ‘index’ : 获得列的众数
1 or ‘columns’ : 获得行的众数
numeric_only : boolean, default False 该项为 True 则只对数字列进行众数计算
返回:
modes : DataFrame (sorted) DataFrame型 众数,已排序
dataframe 统计各个列的元素缺失率
def remove_the_null(data,data1,a): #第二个参数:当缺失率达到多少时,直接删除
t=[]
for col_name in data.columns:
changdu = len(data[col_name])
cnt = list(data[col_name].isna()).count(True)
if (cnt / changdu > a):
del data[col_name]
del data1[col_name]
t.append(col_name)
return data,data1,t
pandas DataFrame中经常出现SettingWithCopyWarning
如果你对原先的dataframe先进行slicing或者indexing,然后赋值,都会出现SettingWithCopyWarning。
情形一
d[d['col_1'] == 0]['col_2'] = 1
会出现警告
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
解决方法,
使用loc或者iloc
d.loc[d['col_1'] == 0, 'col_2'] = 1
情形二
先从原dataframe取出一个子dataframe,然后再对其中的元素赋值,例如
s = d[d['col_1'] == 0]
s.loc[:, 'col_2'] = 1
就会出现
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
解决方法,
对子datafame先进行copy,然后再赋值
s = d[d['col_1'] == 0].copy()
s.loc[:, 'col_2'] = 1
参考资料
'''
对列表中的每个元素进行某种操作
'''
def add(c):
return c**2
l = [1,2,3]
d1 = map(add,l)
print d1
d2 = [c**2 for c in l]
print d2
d3 = [add(c) for c in l]
print d3
df是这样的
import numpy as np
import pandas as pd
df = pd.DataFrame([['Snow','M',22],['Tyrion','M',32],['Sansa','F',18],['Arya','F',14]], columns=['name','gender','age'])
df
Out[3]:
name gender age
0 Snow M 22
1 Tyrion M 32
如果每列都有column name,比如这里是:
df.columns
Out[4]: Index(['name', 'gender', 'age'], dtype='object')
1. df['column_name'] ,df[row_start_index, row_end_index] 选取指定整列数据
df['name']
Out[5]:
0 Snow
1 Tyrion
2 Sansa
3 Arya
Name: name, dtype: object
df[['name','gender']] #选取多列,多列名字要放在list里
Out[6]:
name gender
0 Snow M
1 Tyrion M
2 Sansa F
3 Arya F
df[0:] #第0行及之后的行,相当于df的全部数据,注意冒号是必须的
Out[8]:
name gender age
0 Snow M 22
1 Tyrion M 32
2 Sansa F 18
3 Arya F 14
df[:2] #第2行之前的数据(不含第2行)
Out[9]:
name gender age
0 Snow M 22
1 Tyrion M 32
df[0:1] #第0行
Out[10]:
name gender age
0 Snow M 22
df[1:3] #第1行到第2行(不含第3行)
Out[11]:
name gender age
1 Tyrion M 32
2 Sansa F 18
df[-1:] #最后一行
Out[12]:
name gender age
3 Arya F 14
df[-3:-1] #倒数第3行到倒数第1行(不包含最后1行即倒数第1行)
Out[13]:
name gender age
1 Tyrion M 32
2 Sansa F 18
2. loc,在知道列名字的情况下,df.loc[index,column] 选取指定行,列的数据
# df.loc[index, column_name],选取指定行和列的数据
df.loc[0,'name'] # 'Snow'
df.loc[0:2, ['name','age']] #选取第0行到第2行,name列和age列的数据, 注意这里的行选取是包含下标的。
df.loc[[2,3],['name','age']] #选取指定的第2行和第3行,name和age列的数据
df.loc[df['gender']=='M','name'] #选取gender列是M,name列的数据
df.loc[df['gender']=='M',['name','age']] #选取gender列是M,name和age列的数据
3. iloc,在column name特别长或者index是时间序列等各种不方便输入的情况下,可以用iloc (i = index), iloc完全用数字来定位 iloc[row_index, column_index]
df.iloc[0,0] #第0行第0列的数据,'Snow'
df.iloc[1,2] #第1行第2列的数据,32
df.iloc[[1,3],0:2] #第1行和第3行,从第0列到第2列(不包含第2列)的数据
df.iloc[1:3,[1,2] #第1行到第3行(不包含第3行),第1列和第2列的数据
总结:选取指定行和列的数据
# df.loc[row_index, column_name] loc行包含下标上限,列为列名
# df.iloc[row_index, column_index] iloc行、列均不含下标上限
参考资料
类型:numpy模块
语法:np.ravel(A,’T’)
参数:1)A是多维数组 2)’T‘代表按行优先,为默认值;’F‘代表按列优先
返回值:一维数组。将多维数组A按行或者按列,降为一维数组
import numpy as np #导入numpy,并重命名为np
x = np.array([[1, 2], #x为二维数组
[3, 4]])
print(np.ravel(x)) #将二维数组按行优先,变为一维数组
print(np.ravel(x,'F')) #将二维数组按列优先,变为一维数组
[1 2 3 4] #按行优先
[1 3 2 4] #按列优先
import operator
from functools import reduce
a = [[1,2,3], [4,6], [7,8,9,8]]
print(reduce(operator.add, a))
[1, 2, 3, 4, 6, 7, 8, 9, 8]
a = [[1,2,3], [5, 8], [7,8,9]]
l=[]
for m in range(0,3):
for i in a[m]:
l.append(i)
print(l)
[1, 2, 3, 5, 8, 7, 8, 9]
from itertools import chain
b=[[1,2,3], [5,8], [7,8,9]]
c=list(chain(*b))
print(c)
[1, 2, 3, 5, 8, 7, 8, 9]
a=[[1,2,3], [5,8], [7,8,9]]
a= eval('['+str(a).replace(' ','').replace('[','').replace(']','')+']')
print(a)
[1, 2, 3, 5, 8, 7, 8, 9]
def flatten(a):
if not isinstance(a, (list, )):
return [a]
else:
b = []
for item in a:
b += flatten(item)
return b
if __name__ == '__main__':
a = [[[1,2],3],[4,[5,6]],[7,8,9]]
print(flatten(a))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
ab = [[1,2,3], [5,8], [7,8,9]]
print([i for item in ab for i in item])
[1, 2, 3, 5, 8, 7, 8, 9]
参考资料1
参考资料2