一.iloc 按索引取行列,可能是一行多行,或者一列多列,或者某行某列
>>> df
a b c d
0 1 2 3 4
1 100 200 300 400
2 1000 2000 3000 4000
复制代码
取某行:
>>> df.iloc[0]
a 1
b 2
c 3
d 4
Name: 0, dtype: int64
复制代码
取多行:
>>> df.iloc[:3]
a b c d
0 1 2 3 4
1 100 200 300 400
2 1000 2000 3000 4000
复制代码
取某行某列:
df.iloc[[0, 2], [1, 3]]
b d
0 2 4
2 2000 4000
复制代码
取多行多列:
df.iloc[1:3, 0:3]
a b c
1 100 200 300
2 1000 2000 3000
复制代码
二.loc 按名称取行列,可能是一行多行,或者一列多列,或者某行某列
>>> df
max_speed shield
cobra 1 2
viper 4 5
sidewinder 7 8
复制代码
取一行,返回的是一个series:
df.loc['viper']
返回结果是:
max_speed 4
shield 5
Name: viper, dtype: int64
复制代码
取多行,返回的是一个series:
df.loc['cobra':'viper', 'max_speed']
cobra 1
viper 4
Name: max_speed, dtype: int64
复制代码
两层中括号[[]]取一行或多行,返回一个dataframe:
df.loc[['viper', 'sidewinder']]
max_speed shield
viper 4 5
sidewinder 7 8
复制代码
三、groupby 按一定条件将数据分组并按分组取得各组数据
>>> 原始datframe:df
Animal Max Speed
0 Falcon 380.0
1 Falcon 370.0
2 Parrot 24.0
3 Parrot 26.0
复制代码
按照Animal是否为Falcon,进行分组,并取出各组dataframe
df1=df.groupby(df.Animal=='Falcon') #分组操作
df2=df1.get_group(False)#将分组结果,结果为False即不含有的保存为df2
df3=df1.get_group(True)#将分组结果,结果为True即含有的保存为df3
复制代码
打印结果:
四、两个dataframe合并 merge
df1 = pd.DataFrame({'lkey': [ 'bar', 'baz', 'foo'],
'value': [2, 3, 5]})
df2 = pd.DataFrame({'lkey': ['bar', 'baz', 'foo'],
'value': [ 6, 7, 8]})
print(df1)
print(df2)
df1.merge(df2,how='left',on='lkey')
输出结果:
lkey value
0 bar 2
1 baz 3
2 foo 5
lkey value
0 bar 6
1 baz 7
2 foo 8
Out[66]:
lkey value_x value_y
0 bar 2 6
1 baz 3 7
2 foo 5 8
复制代码
how='left'是连接方式,本例是左连接
on='lkey'是键的选择,左右连接方式是按lkey相同来合并
五、看dataframe的行数与列数 shape
y_pd是一个dataframe
print('行数:',y_pd.shape[0])
print('列数:',y_pd.shape[1])
复制代码
六、一列数据是str,替换其中某字符 .str.replace
df = pd.DataFrame({"抽烟": ['1-2', '2-3', '4-7'], "B": [4, 5, 6]})
df["抽烟"]=df["抽烟"].str.replace('-',',')
原始df:
B 抽烟
0 4 1-2
1 5 2-3
2 6 4-7
替换后df:
B 抽烟
0 4 1,2
1 5 2,3
2 6 4,7
#对字符做截取.str[n:m],取第n-m个字符
df['抽烟']=df['抽烟'].str[0:-1]
B 抽烟
0 4 1-
1 5 2-
2 6 4-
复制代码
七、修改列名 rename
df = pd.DataFrame({"抽烟": [1, 2, 3], "B": [4, 5, 6]})
df.rename(columns={"抽烟": "烟龄/每日几支",'B':'喝酒'},inplace=True)
B 抽烟
0 4 1
1 5 2
2 6 3
变为
喝酒 烟龄/每日几支
0 4 1
1 5 2
2 6 3
复制代码
八、将某一列或者几列中的值替换为另一个值 replace
df = pd.DataFrame({'A': [',', '/', '='],
'B': ['1', 'b', '/']})
df.replace({'A':',','B':'b'},'换')
原来df:
A B
0 , 1
1 / b
2 = /
变化后:
A B
0 换 1
1 / 换
2 = /
复制代码
对整个df中某个值做替换
df.replace('/','全换')
全换后:
A B
0 , 1
1 全换 b
2 = 全换
复制代码
通过字典的嵌套,实现对任意列任意值的替换:
df.replace({'A': {'=': '==', '/': '//'},'B':{'1':'111'}} )
替换后:
A B
0 , 111
1 // b
2 == /
复制代码
九、如果a列的值等于m,修改b列的值为n
df.loc[df['a']==m,'b']=n
修改前df:
a b
14 360
ba0 360
13 180
df.loc[df['a'] == '13','b'] =666
修改之后:
a b
14 360
ba0 360
13 666
复制代码
十、删除某一列或者几列 drop
df = pd.DataFrame({'a': ['1/1', '13/12', '14/1'],
'b': [360, 180, 360],'c':[1,2,3] })
df.drop(columns=['a','b'],axis=1,inplace=True)
原df:
a b c
0 1/1 360 1
1 13/12 180 2
2 14/1 360 3
删除后:
c
0 1
1 2
2 3
复制代码
十一、一列拆分成两列 str.split('符号')
df = pd.DataFrame({'a': ['1/1', '13/12', '14/1'],
'b': [360, 180, 360],'c':[1,2,3] })
方法一:
df2=pd.DataFrame(df['a'].str.split('/',expand=True))
df2如下:
0 1
0 1 1
1 13 12
2 14 1
方法2:
df2=pd.DataFrame( (a.split('/') for a in df['a']),
index=df.index,columns=['拆1','拆2'])
df2如下:
拆1 拆2
0 1 1
1 13 12
2 14 1
复制代码
十二、apply函数与匿名函数合用做批量修改
df = pd.DataFrame({'a': ['1/1', '13/12', '14/1'],
'b': [360, 180, 360],'c':[1,2,3] })
df['a']=df['a'].apply(lambda x:x[0])
#相当于对a这一列做变换,都改为第一个字符
df
a b c
0 1 360 1
1 1 180 2
2 1 360 3
复制代码
十三、read_csv中 parse_dates参数
读取时,使某一列或几列为datetime类型,为日期列。
pd.read_csv('path',parse_dates=['1'])
-> 解析1列的值作为独立的日期列;
复制代码
十四、缺失值检测 isna()==isnull()
df = pd.DataFrame({'age': [5, 6, 2,1],
'born': [pd.NaT, pd.Timestamp('1939-05-27'),
pd.Timestamp('1940-04-25'),pd.Timestamp('1939-05-27')],
'name': ['Alfred', 'Batman', '','11'],
'toy': [None, 'Batmobile', 'Joker','2d']})
【1】df.isna()
输出:是一个dataframe,反映了每个位置是否为缺失值
age born name toy
0 False True False True
1 False False False False
2 False False False False
3 False False False False
【2】df.isna().sum()
输出:是一个Series,反映了每列空值的个数
age 0
born 1
name 0
toy 1
dtype: int64
【3】df.isna().any()
输出:是一个Series,反映了每列是否有空值
age False
born True
name False
toy True
dtype: bool
【4】df.isna().sum().any()
输出:一个布尔值,反映了整个表是否有空值
True
【5】percent = (df.isnull().sum())/(df.isnull().count()*100)
输出:反映了每列空值的占比
age 0.0000
born 0.0025
name 0.0000
toy 0.0025
dtype: float64
复制代码
十五、对Series里面的每个值进行计数并且排序 value_counts()
index = pd.Index([3, 1, 2, 3, 4, np.nan])
index.value_counts()
输出:
3.0 2
4.0 1
2.0 1
1.0 1
复制代码
df = pd.DataFrame({'a': ['1/1', '13/12', '14/1'],
'b': [360, 180, 360],'c':[1,2,3] })
df['a'].value_counts()
输出:
1/1 1
14/1 1
13/12 1
Name: a, dtype: int64
df['a'].value_counts().values
array([1, 1, 1])
df['a'].value_counts().index
Index(['1/1', '14/1', '13/12'], dtype='object')
复制代码
十六、按多个列进行分组
先按gender进行分组,在每个gender內按照happiness进行分组并统计。
train.groupby(['gender','happiness']).happiness.count()
gender happiness
1 1 43
2 216
3 588
4 2306
5 599
2 1 61
2 281
3 571
4 2512
5 811
复制代码
画图来看就是
import seaborn as sns
sns.countplot('gender',hue='happiness',data=train)
复制代码
结果为:
十七、concat之后的索引重置
df.reset_index(drop=True)
复制代码
不然的话,索引还和concat之前一样,出现重复的现象。
十八、值填充时-用出现次数最多的填充
对a列中,值小于0的填充为除去空值以外出现最多的值
df.loc[df['a']<0,'a']=df['a'].dropna().mode().values
复制代码
十九、按照一列的分组计算另一列的均值
df = pd.DataFrame({"name": ['1', '1', '2'],
"toy": [10, 20, 30],
"born": [1, 2,
3]})
df['d']=df.groupby(df['name']=='1')['toy'].transform('mean').values
output:
born name toy d
0 1 1 10 15
1 2 1 20 15
2 3 2 30 30
复制代码