from pandas import DataFrame
df1 = DataFrame([['aa','bb','cc'],['A','B','C'],['a','b','c']],index=['r1','r2','r3'],columns=['c1','c2','c3'])
print(df1)
>> c1 c2 c3
>>r1 aa bb cc
>>r2 A B C
>>r3 a b c
# 直接访问列名来访问对应的 变量名[列名称1,列名称2,...]:
>>r1 aa
>>r2 A
>>r3 a
>>Name: c1, dtype: object
#离散选取不同的列
print(df1[['c1','c3']])
>> c1 c3
>>r1 aa cc
>>r2 A C
>>r3 a c
#需要一块连续的列位置时:直接调用.columns[c1:c2]属性切片 左闭右开 c1 到c2-1
#值得注意的是,变量名.columns[c1:c2] 中的 c1 与 c2 只接受整型参数
print(df1[df1.columns[0:2]])
>> c1 c2
>>r1 aa bb
>>r2 A B
>>r3 a b
# 使用切片的形式访问对应的行: 变量名[r1:r2] 访问 从r1 到 r2-1行的数据(其中列全部被包含)
print(df1[0:2])
>> c1 c2 c3
>>r1 aa bb cc
>>r2 A B C
#<<===============================使用 变量名.loc[] ===============================>>
#使用格式 变量名.loc[行名称1:行名称2,列名称1:列名称2]
#选取该从行名称1 到 行名称2 与 列名称1 到 列名称2 范围的所有数值
#当不写切片时,为精确查找某个位置上的值
print(df1.loc['r1','c1'])
>>aa
#知道行与列名称===================
print(df1.loc['r1':'r2','c1':'c3'])
>> c1 c2 c3
>>r1 aa bb cc
>>r2 A B C
#离散的选取行
#上面的行选择是使用了切片产生了一个列表作为行的选择,在这里我们手动构造了一个行名字[列表]
print(df1.loc[['r1','r3'],'c1':'c3'])
>> c1 c2 c3
>>r1 aa bb cc
>>r3 a b c
#知道行下标与列名称================
print(df1.loc[df1.index[0:3],'c1':'c3'])
>> c1 c2 c3
>>r1 aa bb cc
>>r2 A B C
>>r3 a b c
#离散的选取行
#我们也可以选择使用 变量名.index[[r1,..,rn]] 来获得指定列表中的对应行(r1,...,rn)的名称
print(df1.loc[df1.index[[0,2]],'c1':'c3'])
>> c1 c2 c3
>>r1 aa bb cc
>>r3 a b c
#知道行名称与列下标================
print(df1.loc['r1':'r3',df1.columns[0:3]])
>> c1 c2 c3
>>r1 aa bb cc
>>r2 A B C
>>r3 a b c
#离散的选取列
print(df1.loc['r1':'r3',df1.columns[[0,2]]])
>> c1 c3
>>r1 aa cc
>>r2 A C
>>r3 a c
#<<=============================== 变量名.iloc[] ===============================>>
#使用格式 变量名.iloc[r1:r2,c1:c2] 选取,其中参数均为整型。
#选取从 第r1行 到 r2行-1 与 c1列 到c2-1列范围内的所有数值
#这个也同理,不写切片形式时,将精确到一个数据
print(df1.iloc[0,0])
>>aa
#知道行位置与列位置================
print(df1.iloc[0:3,0:3])
>> c1 c2 c3
>>r1 aa bb cc
>>r2 A B C
>>r3 a b c
#离散的选取
print(df1.iloc[[0,2],0:3])
>> c1 c2 c3
>>r1 aa bb cc
>>r3 a b c
#知道行名称与列下标================
print(df1.iloc[df1.index.get_loc('r1'):3,0:3])
>> c1 c2 c3
>>r1 aa bb cc
>>r2 A B C
>>r3 a b c
#离散的选取
print(df1.iloc[[df1.index.get_loc('r1'),df1.index.get_loc('r3')],0:3])
>> c1 c2 c3
>>r1 aa bb cc
>>r3 a b c
#知道行下标与列名称================
print(df1.iloc[0:3,df1.columns.get_loc('c1'):df1.columns.get_loc('c3')+1])
#这里需要注意的是,切片区间为左闭右开,故用get_loc取得数值作为右区间时得+1
>> c1 c2 c3
>>r1 aa bb cc
>>r2 A B C
>>r3 a b c
#离散的选取与前面的思想一样
print(df1.iloc[0:3,[df1.columns.get_loc('c1'),df1.columns.get_loc('c3')]])
>> c1 c3
>>r1 aa cc
>>r2 A C
>>r3 a c
#<<===============================使用 变量名.at[行名称,列名称] ===============================>>
#用法 变量名.at[行名称,列名称] 精确到什么行名称中的什么列名称中的一个值
print(df1.at['r1','c1'])
>>aa
#采用 变量名.iat[r1,c1] 精确到第r1行第c1列中的一个值
print(df1.iat[0,0])
>>aa
# ===小总结 方法中 名字前面带 i 的只接受参数为整型,不带 i 的接受参数为自定义的
#修改列名称
df1.columns = ['C1','C2','C3']
print(df1)
>> C1 C2 C3
>>r1 aa bb cc
>>r2 A B C
>>r3 a b c
#修改行索引
df1.index = ['R1','R2','R3']
print(df1)
>> c1 c2 c3
>>R1 aa bb cc
>>R2 A B C
>>R3 a b c
#删除
#以下两种均不会改变原序列
#根据行名来删除 其中axis可省略不写,默认=0 表示按行删除
print(df1.drop('r1',axis=0))
>> c1 c2 c3
>>r2 A B C
>>r3 a b c
#根据列名删除,其中axis=1不可省略。
print(df1.drop('c1',axis=1))
>> c2 c3
>>r1 bb cc
>>r2 B C
>>r3 b c
#第二种删除列的方法:使用del ,将会改变原序列
del df1['c1']
print(df1)
>> c2 c3
>>r1 bb cc
>>r2 B C
>>r3 b c
#增
#添加新的一列
df1['c4'] = ['test1','test2','test3']
print(df1)
>> c1 c2 c3 c4
>>r1 aa bb cc test1
>>r2 A B C test2
>>r3 a b c test3
#添加新的一行
#这里是将两个DataFrame用append方法合并。且,需要明确声明新建合并的DataFrame中的列名
#如果不声明列名,将会出现和与Series一样的情况:出现很多NaN,因为,新建的DataFrame列名默认从0开始
df2 = df1.append(DataFrame([['newA','newB','newC']],index=['r4'],columns=['c1','c2','c3']))
print(df2)
>> c1 c2 c3
>>r1 aa bb cc
>>r2 A B C
>>r3 a b c
>>r4 newA newB newC
#或是这样:与上述方法效果一样
df1.loc['r4'] = ['newA','newB','newC']
#若是添加了ignore_index = True 参数的话,将置全部的行名从0开始
df2 = df1.append(DataFrame([['newA','newB','newC']],index=['r4'],columns=['c1','c2','c3']),ignore_index=True)
print(df2)
>> c1 c2 c3
>>0 aa bb cc
>>1 A B C
>>2 a b c
>>3 newA newB newC