美文网首页
pandas数据框操作

pandas数据框操作

作者: 千千罐 | 来源:发表于2020-11-03 15:55 被阅读0次
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")

相关文章

网友评论

      本文标题:pandas数据框操作

      本文链接:https://www.haomeiwen.com/subject/aativktx.html