pandas中dataframe常用操作笔记

#数据概览
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

pandas DataFrame 数据选取,修改,切片

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.ravel() --- 数组 --- python

 

类型: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
 

你可能感兴趣的:(数据预处理)