创建Series
s = pd.Series([1,3,4,np.nan,44,1])
相当于numpy中的一维数组,数据类型默认为float64
创建DataFrame
dates = pd.date_range("20220101", periods = 6)
A = np.arange(24).reshape(6,4)
df1 = pd.DataFrame(A, index = dates, columns=['a','b','c','d'])
df2 = pd.DataFrame({'A':1.,'B':'foo','E': pd.Categorical(["test", "train", "test", "train"])})
- df1生成DataFrame时,三个参数分别代表数据内容,行名称,列名称
- 当没有显式声明行列名称时,默认为从0开始的下标
- df2中是使用字典生成,其中,字典的键名代表列的名称,值代表该列的值,需要注意的是,使用该方法是必须传入一个可迭代的对象,或者直接指定index
DataFrame的属性
df2 = pd.DataFrame({'A':1.,'B':'foo'}, index=[0])
df2.dtypes # 输出每列的数据类型
df2.index # 输出行的index名称
df2.columns # 输出列的index名称
df2.values # 以行为单位打印数据内容
df2.describe() # 运算数值类型的一些方差、平均值、数量等
df2.T # 转置
df.sort_index(axis=0,ascending=False) # 根据索引排序
df.sort_values(by='a',ascending=False) # 根据某一列的值进行排序
在排序中,如果axis=0,表示按照行索引进行排序,axis=1,表示按照列索引进行排序,ascending属性控制升序或者降序,默认为True(升序)
选择DF中的某一列值
# 使用列索引名
df['a']
df.a
使用切片获取行的数据
df[0:3]
df['20220101':'20220104']
方式1:切片两边是左开右闭的
方式2:切片是完全闭合的
Select by label:loc
df.loc['20220101']
df.loc[:,'a':'b']
df.loc[['20220101','20220104'],['a','c']]
方式1:只能使用行标签的值来获取一行的数据
方式2:获取列的数据
方式3:可以同时指定行或者列需要选取的数据范围
Select by position:iloc
df.iloc[3,1]
df.iloc[3:5,1:3]
df.iloc[[2,3,5],1:3]
使用序号进行切片时,是左开右闭的
Boolean indexing
df[df.a>8] # 符合条件的行的所有列数据
df[df.a>8]['a'] # 符合条件的行的某一列数据
# 通过标签或索引进行定位修改
df.iloc[2,2]=111
df.loc['20220101','d'] = 100
# 修改某一列中满足条件的行
df.b[df.a > 3] = 90
df['f'] = np.nan
# 此种方式,需要将新传入的series的index与dataframe已有的index对齐
df['e'] = pd.Series([1,2,3,4,5,6],index=pd.date_range('20220101',periods=6))
本质上来说,赋值操作很简单,重点还是选择你需要修改的数据
df.dropna(axis=1, how='any')
df.fillna(value=0)
df.isnull() # 输出boolean矩阵,判断是否有缺失
print(np.any(df.isnull())) # 当结果为true时,表示df.isnull()的结果中包含至少一个true,表示有缺失值
dropna( ):
- axis = 0,丢弃行;axis=1 丢弃列
- how = any,只要出现一个就丢弃;how=all,全部都是才丢弃
data = pd.read_csv('Student.csv') # 导入数据
data.to_pickle('student.pickle') #导出数据
df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'])
df2 = pd.DataFrame(np.ones((3,4))*1, columns=['a','b','c','d'])
df3 = pd.DataFrame(np.ones((3,4))*2, columns=['a','b','c','d'])
res = pd.concat([df1,df2,df3], axis=0, ignore_index=True)
- axis指定合并的方向,通过shape来记忆,比如两个shape(3,4)在axis=0合并时,结果是shape(6,4)
- ignore_index=True,忽略原来的索引,默认情况下时false,会导致合并后的行索引重复
# join,['inner','outer']
df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'], index=[1,2,3])
df2 = pd.DataFrame(np.ones((3,4))*1, columns=['b','c','d','e'], index=[2,3,4])
print(df1)
print(df2)
res = pd.concat([df1,df2], join='inner',ignore_index=True)
print(res)
- 要合并的两个df,列和index不完全相同,如果直接合并会将某一个df中不相同的部分填充nan
- join=‘outer’会将不同部分填充nan,join=’inner‘,只对两者相同的部分进行填充
# 在一个df后添加另一个完整的df
df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'])
df2 = pd.DataFrame(np.ones((3,4))*1, columns=['a','b','c','d'])
res = df1.append(df2,ignore_index=True)
# 也可以只添加一行,即添加一个Series
df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'])
s1 = pd.Series([1,2,3,4],index=['a','b','c','d'])
res = df1.append(s1, ignore_index=True)
left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
res = pd.merge(left, right, on='key')
此处在merge函数中的on属性,表示在某一列上合并,这一列必须是共有的列,且列上的值需要相同
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
res = pd.merge(left,right, on = ['key1','key2'],how='inner')
# inner
key1 key2 A B C D
0 K0 K0 A0 B0 C0 D0
1 K1 K0 A2 B2 C1 D1
2 K1 K0 A2 B2 C2 D2
# outer
key1 key2 A B C D
0 K0 K0 A0 B0 C0 D0
1 K0 K1 A1 B1 NaN NaN
2 K1 K0 A2 B2 C1 D1
3 K1 K0 A2 B2 C2 D2
4 K2 K1 A3 B3 NaN NaN
5 K2 K0 NaN NaN C3 D3
# left
key1 key2 A B C D
0 K0 K0 A0 B0 C0 D0
1 K0 K1 A1 B1 NaN NaN
2 K1 K0 A2 B2 C1 D1
3 K1 K0 A2 B2 C2 D2
4 K2 K1 A3 B3 NaN NaN
# right
key1 key2 A B C D
0 K0 K0 A0 B0 C0 D0
1 K1 K0 A2 B2 C1 D1
2 K1 K0 A2 B2 C2 D2
3 K2 K0 NaN NaN C3 D3
只能合并共有列中值完全相同的部分,也就是how='inner’即默认的方法
how=[‘inner’,‘outer’,‘left’,‘right’]
inner:只合并key完全相同的部分
outer :全部进行合并,没有的数据填充nan
left:基于第一个df的key进行合并
right:基于第二个df的key进行合并
# data
df1 = pd.DataFrame({'col1':[0,1], 'col_left':['a','b']})
df2 = pd.DataFrame({'col1':[1,2,2],'col_right':[2,2,2]})
res = pd.merge(df1, df2, on='col1', how='outer', indicator=True)
indicator参数:可以显示合并后的df的数据来源分布,默认情况下indicator=False
也可以对indicator参数赋一个字符串,标明这一来源列的名称
# merged by index
left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2']},
index=['K0', 'K1', 'K2'])
right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],
'D': ['D0', 'D2', 'D3']},
index=['K0', 'K2', 'K3'])
print(left)
print(right)
# left_index and right_index
res = pd.merge(left, right, left_index=True, right_index=True, how='outer')
res = pd.merge(left, right, left_index=True, right_index=True, how='inner')
# handle overlapping
boys = pd.DataFrame({'k': ['K0', 'K1', 'K2'], 'age': [1, 2, 3]})
girls = pd.DataFrame({'k': ['K0', 'K0', 'K3'], 'age': [4, 5, 6]})
res = pd.merge(boys, girls, on='k', suffixes=['_boy', '_girl'], how='inner')
# res
k age_boy age_girl
0 K0 1 4
1 K0 1 5
suffixes参数指明了对合并的merge中同名列的处理
# Series
data = pd.Series(np.random.randn(1000), index=np.arange(1000))
data = data.cumsum() # 输出1000个数据的逐次累加和
data.plot()
# DataFrame
data = pd.DataFrame(np.random.randn(1000, 4), index=np.arange(1000), columns=list("ABCD"))
data = data.cumsum()
# plot methods:
# 'bar', 'hist', 'box', 'kde', 'area', scatter', hexbin', 'pie'
ax = data.plot.scatter(x='A', y='B', color='DarkBlue', label="Class 1")
data.plot.scatter(x='A', y='C', color='LightGreen', label='Class 2', ax=ax)
plt.show()