1.创建dataframe
import pandas as pd
import numpy as np
#示例1
dates = pd.date_range('20180310',periods=6)
#生成6⾏4列的DataFrame
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=['A','B','C','D'])
print(df)
A B C D
2018-03-10 1.622596 -0.527778 -0.171904 -0.423856
2018-03-11 1.065103 0.794154 0.539161 0.832330
2018-03-12 -0.184665 0.523445 0.181310 1.437474
2018-03-13 2.247116 -1.307329 0.894290 -0.693308
2018-03-14 0.454593 -0.407932 1.499813 1.145216
2018-03-15 1.724579 -1.709418 -0.393775 1.350365
#DataFrame 行数和列数
df.shape
(6, 4) #(行,列)
df.shape[0] #行数 同len(df)
df.shape[1] #列数
#示例2
df = pd.DataFrame(columns=['Chr','Position','Depth','InBed'])
print(df_new)
Empty DataFrame
Columns: [Chr, Position, Depth, InBed]
Index: []
#增加一行新的信息,必须进行赋值,否则原来的df_new,不会发生改变
df = df.append({'Chr':'chr1','Position':11166662,'Depth':200,'InBed':True},ignore_index=True)
print(df_new)
Chr Position Depth InBed
0 chr1 11166662 200 True
#示例3
df = pd.DataFrame(index=range(1,10))
#示例4,读取网上数据
df = pd.read_excel("https://github.com/chris1610/pbpython/blob/master/data/sample-salesv3.xlsx?raw=True")
df[0:5] #输出前5行数据
account number name sku quantity unit price ext price date
0 740150 Barton LLC B1-20000 39 86.69 3380.91 2014-01-01 07:21:51
1 714466 Trantow-Barrows S2-77896 -1 63.16 -63.16 2014-01-01 10:00:47
2 218895 Kulas Inc B1-69924 23 90.70 2086.10 2014-01-01 13:24:58
3 307599 Kassulke, Ondricka and Metz S1-65481 41 21.05 863.05 2014-01-01 15:05:22
4 412290 Jerde-Hilpert S2-34077 6 83.21 499.26 2014-01-01 23:26:55
2.简单数据选择
#输出索引是A的列,同 print(df.A)
print(df['A'])
2018-03-10 1.622596
2018-03-11 1.065103
2018-03-12 -0.184665
2018-03-13 2.247116
2018-03-14 0.454593
2018-03-15 1.724579
Freq: D, Name: A, dtype: float64
#按照index,输出前三行
print(df[0:3])
A B C D
2018-03-10 1.622596 -0.527778 -0.171904 -0.423856
2018-03-11 1.065103 0.794154 0.539161 0.832330
2018-03-12 -0.184665 0.523445 0.181310 1.437474
#按照行名称输出
print(df['20180310':'20180314'])
A B C D
2018-03-10 1.622596 -0.527778 -0.171904 -0.423856
2018-03-11 1.065103 0.794154 0.539161 0.832330
2018-03-12 -0.184665 0.523445 0.181310 1.437474
2018-03-13 2.247116 -1.307329 0.894290 -0.693308
2018-03-14 0.454593 -0.407932 1.499813 1.145216
3.根据标签loc进行数据选择
#按照行标签进行选择 精确选择
print(df.loc['20180312', ['A','B']])
A -0.184665
B 0.523445
Name: 2018-03-12 00:00:00, dtype: float64
4.根据序列iloc进行数据选择
#输出第三行第一列的数据
print(df.iloc[3, 1])
-1.3073288613025071
#进行切片选择
print(df.iloc[3:5,0:2])
A B
2018-03-13 2.247116 -1.307329
2018-03-14 0.454593 -0.407932
#进行不续筛选
print(df.iloc[[1,2,4],[0,2]])
A C
2018-03-11 1.065103 0.539161
2018-03-12 -0.184665 0.181310
2018-03-14 0.454593 1.499813
5.混合使用进行数据选择
#.ix 可以使用,但已经被废弃
print(df.ix[:3, ['A', 'C']])
A C
2018-03-10 1.622596 -0.171904
2018-03-11 1.065103 0.539161
2018-03-12 -0.184665 0.181310
6.根据条件进行筛选
### 且 &
### 或 |
print(df)
A B C D
2018-03-10 -0.818377 1.985548 0.836204 0.560117
2018-03-11 -1.357577 -1.741047 0.682593 -1.528600
2018-03-12 1.259822 -0.246002 0.692269 -0.982593
2018-03-13 1.666198 -0.285003 0.442589 0.277535
2018-03-14 -0.080913 0.030601 -1.779290 1.101479
2018-03-15 -0.408474 -0.019759 -0.017402 -1.182830
#筛选出df.A大于0的元素,布尔条件筛选
df[df.A > 0]
A B C D
2018-03-12 1.259822 -0.246002 0.692269 -0.982593
2018-03-13 1.666198 -0.285003 0.442589 0.277535
#多个条件
df[(df['A'] > 0 ) & (df['D'] < 0)]
A B C D
2018-03-12 1.259822 -0.246002 0.692269 -0.982593
7.查看并转换数据类型
#查看数据类型
df.dtypes
#将数据转化为字符串
df.astype(str)
8.根据bool值进行筛选
df = pd.DataFrame({'a':[True, False, False, True],'b':[1,2,3,4]})
print(df)
a b
0 True 1
1 False 2
2 False 3
3 True 4
#筛选a列为True的列
df[df['a']]
a b
0 True 1
3 True 4
#筛选a列为False的列
df[~df['a']]
a b
1 False 2
2 False 3
9.根据reindex对列重排或增加
df = pd.DataFrame({'a':[True, False, False, True],'b':[1,2,3,4],'c':[2,3,4,4]})
df
a b c
0 True 1 2
1 False 2 3
2 False 3 4
3 True 4 4
#方法一
df.reindex(columns=list('cba'))
#方法二
df.reindex(columns=list(['c','b','a']))
c b a
0 2 1 True
1 3 2 False
2 4 3 False
3 4 4 True
#reindex 还有 fill_value 选项,默认可以填充NaN,如果list 中的列名不在dataframe中,则会增加一列,值为NaN
df.reindex(columns=list('cbae'))
e c b a
0 NaN 2 1 True
1 NaN 3 2 False
2 NaN 4 3 False
3 NaN 4 4 True
#可以设置fill_value
df.reindex(columns=list('cbae'),fill_value=0)
e c b a
0 0 2 1 True
1 0 3 2 False
2 0 4 3 False
3 0 4 4 True
#但如果列名的长度大于1,就不能用第一种方法了
df = pd.DataFrame({'ad':[True, False, False, True],'ba':[1,2,3,4],'cc':[2,3,4,4]})
df
ad ba cc
0 True 1 2
1 False 2 3
2 False 3 4
3 True 4 4
#得到的结果是错的
df.reindex(columns=list('ccbaad'))
c c b a a d
0 NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN NaN
#得到的结果是正确的
df.reindex(columns=list(['cc','ba','ad']))
cc ba ad
0 2 1 True
1 3 2 False
2 4 3 False
3 4 4 True
10.根据insert在指定位置增加列
# 列表.insert(位置,'列名')
# 第一步:后的原dataframe的列名
df = pd.DataFrame({'a':[True, False, False, True],'b':[1,2,3,4],'c':[2,3,4,4]})
col_name = df.columns.tolist()
print(col_name)
['a', 'b', 'c']
#第二步:在指定位置增加列名
col_name.insert(0,'E') #增加在最前面,成为第一列
['E', 'a', 'b', 'c']
col_name.insert(1,'D') #增加在第一列后面,成为第二列
['E', 'D', 'a', 'b', 'c']
#第三步:用reindex,给增加的列赋值
df.reindex(columns=col_name)
E D a b c
0 NaN NaN True 1 2
1 NaN NaN False 2 3
2 NaN NaN False 3 4
3 NaN NaN True 4 4
#另外:或者不用数字索引,直接在某列前面或后面插入,利用 list.index的方法
print(df)
a b c
0 True 1 2
1 False 2 3
2 False 3 4
3 True 4 4
#在指定列前面插入新列
col_name = df.columns.tolist()
col_name.insert(col_name.index('b'),'D')# 在 b 列前面插入
['a', 'D', 'b', 'c']
df.reindex(columns=col_name)
a D b c
0 True NaN 1 2
1 False NaN 2 3
2 False NaN 3 4
3 True NaN 4 4
#在指定列后面一列插入新列
col_name = df.columns.tolist()
col_name.insert(col_name.index('b')+1,'D') # 在 b 列后面插入
['a', 'b', 'D', 'c']
df.reindex(columns=col_name)
a b D c
0 True 1 NaN 2
1 False 2 NaN 3
2 False 3 NaN 4
3 True 4 NaN 4
11.根据对列或行进行删减
df = pd.DataFrame(np.arange(12).reshape(3,4), columns=['A', 'B', 'C', 'D'])
df
A B C D
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
#方法一:一定要指定axis=1,否则会报错
df.drop(['B', 'C'], axis=1)
A D
0 0 3
1 4 7
2 8 11
#方法二
df.drop(columns=['B', 'C'])
A D
0 0 3
1 4 7
2 8 11
#方法三
df_new = pd.DataFrame(df,columns = ['A','D'])
#删除行
df.drop([0, 1])
A B C D
2 8 9 10 11
12.根据groupby进行分组
df.groupby(..., axis=1).agg(...)
df.groupby(..., axis=1).apply(...)
#########示例1
#第一步:创建data
data = {
'Item_2_id': {0: 24, 1: 41, 2: 34},
'Item_2_quantity': {0: 4, 1: 1, 2: 4},
'Item_3_id': {0: 16, 1: 33, 2: 8},
'Item_3_quantity': {0: 1, 1: 1, 2: 2},
'customer_name': {0: 'John', 1: 'Paul', 2: 'Andrew'},
'item_1_id': {0: 4, 1: 8, 2: 1},
'item_1_quantity': {0: 1, 1: 3, 2: 1},
'order_id': {0: 1, 1: 2, 2: 3}
}
#第二步:设置列名
cols = 'order_id customer_name item_1_id item_1_quantity Item_2_id Item_2_quantity Item_3_id Item_3_quantity'.split()
#第三步:创建dataframe
df = pd.DataFrame(data)[cols]
order_id customer_name item_1_id item_1_quantity Item_2_id Item_2_quantity Item_3_id Item_3_quantity
0 1 John 4 1 24 4 16 1
1 2 Paul 8 3 41 1 33 1
2 3 Andrew 1 1 34 4 8 2
#第四步:
id_vars = ['order_id','customer_name']
df.set_index(id_vars).groupby(lambda x: x.split('_')[-1], axis=1).agg(lambda x: x.tolist())
df[id_vars].assign(id=df.filter(regex='[Ii]tem_\d+_id').values.tolist(),quantity=df.filter(regex='[Ii]tem_\d+_quantity').values.tolist())
order_id customer_name id quantity
0 1 John [4, 24, 16] [1, 4, 1]
1 2 Paul [8, 41, 33] [3, 1, 1]
2 3 Andrew [1, 34, 8] [1, 4, 2]
df.groupby(..., axis=1).agg(...)
df.groupby(..., axis=1).apply(...)
#########示例2
df1 = pd.DataFrame({'a':['2020-01-01', '2020-02-01', '2020-03-01', '2020-04-01'],'b':[1,2,3,4],'c':[2,3,4,4]})
df2 = pd.DataFrame({'a':['2020-01-01', '2020-02-01', '2020-03-01', '2020-04-01'],'b':['a','c','d','e'],'c':['A','E','C','F']})
df3 = df1.append(df2)
print(df3)
a b c
0 2020-01-01 1 2
1 2020-02-01 2 3
2 2020-03-01 3 4
3 2020-04-01 4 4
0 2020-01-01 a A
1 2020-02-01 c E
2 2020-03-01 d C
3 2020-04-01 e F
#ignore_index=True,行index会重新排序
#sort=False,列名不会重新排序,否则会进行重新排序
pd.concat([df1,df2],ignore_index=True,sort=False)
a b c
0 2020-01-01 1 2
1 2020-02-01 2 3
2 2020-03-01 3 4
3 2020-04-01 4 4
4 2020-01-01 a A
5 2020-02-01 c E
6 2020-03-01 d C
7 2020-04-01 e F
df3 = pd.concat([df1,df2],ignore_index=True)
#根据a列,将b列信息按照设置的连接符进行连接,这里如果是数字,需要通过df.astye(str),先进行转换
df3.groupby('a')['b'].apply(lambda x:x.astype(str).str.cat(sep=':')).reset_index()
a b
0 2020-01-01 1:a
1 2020-02-01 2:c
2 2020-03-01 3:d
3 2020-04-01 4:e
13.根据split对列或者行按字符分割
df = pd.DataFrame({'AB': ['A1-B1', 'A2-B2']})
df
AB
0 A1-B1
1 A2-B2
df['AB'].str.split('-')
0 [A1, B1]
1 [A2, B2]
#与上一步的区别是expand后,列会分成多列
df['AB'].str.split('-',expand=True)
0 1
0 A1 B1
1 A2 B2
#取列的第一个字符
df['AB'].str[0]
0 A
1 A
14.列或者行进行重命名
#方法一
df.rename(columns = ['SomaticStatus_Judge', 'VAF', 'Sample', 'Count'])
#方法二
df.columns = ['SomaticStatus_Judge', 'VAF', 'Sample', 'Count']
15.列或者行进行计算
df = pd.read_table(f_in,sep="\t")
copy_number = 2 ** df['log2'] * 2
#保留2为小数
df['copy_number'] = copy_number.map(lambda x:("%.2f")%x)
#转换为%,并保留2为小数
df['copy_number'] = copy_number.map(lambda x:format(x,".2%"))
#导出
df.to_csv(f_out,index=False,header=True,sep="\t")
网友评论