DataFrame常用操作

  • Post author:
  • Post category:其他




1、DataFrame切片



(1)df [ [ ‘a ‘] ]

得到一列列名为a的DataFrame



(2)df [ ‘a ‘]

得到一列Name为a的Series



(3)df.loc[ [1,2], [‘a ‘, ‘b ‘] ]

得到第1、2行,a、b列的DataFrame



(4)df.iloc[4:5, 1:3]

得到第4行,1、2列的DataFrame



(5)df.iloc[0, :] 与df.iloc[0]等同

取第0行



2、DataFrame删除



(1)df.drop([列名], axis=1)

删除某一列



(2)df.dropna(how=‘all’)

删除全为nan的行



(3)df.dropna(how=‘any’, axis=1)

删除含有nan的列



(4)df.dropna()与df.dropna(how=‘any’, axis=0)等同

删除含有nan的行



3、DataFrame判定重复



(1)df.duplicated(列名 / subset = 列名, keep=‘first’ / ‘last’ / False)

根据给定列中的value,标出重复的行

参数:
    'first': 除第一次出现的重复项,其余重复项均标记为True。
    'last': 除最后一次出现的重复项,其余重复项均标记为True。
    False: 将所有重复项标记为True。
data2 = {1:[1,2,2],2:[4,2,6],3:[4,2,6]}
df2 = pd.DataFrame(data2)
df2
Out[22]: 
   1  2  3
0  1  4  4
1  2  2  2
2  2  6  6
dup = df2.duplicated(subset= 1,keep=False)
dup
Out[24]: 
0    False
1     True
2     True
dtype: bool



4、DataFrame删除重复



(1)df.drop_duplicates(列名 / subset = 列名, keep=‘first’ / ‘last’ / False)

根据给定列中的value,删除重复的行

keep默认‘first’。

参数:
   'first': 除第一个匹配项外,删除其余重复项。
   'last': 除最后一个匹配项外,删除其余重复项。
   False: 删除所有重复项。
data2 = {1:[1,2,2],2:[4,2,6],3:[4,2,6]}
df2 = pd.DataFrame(data2)
df2
Out[28]: 
   1  2  3
0  1  4  4
1  2  2  2
2  2  6  6
dup3 = df2.drop_duplicates(1,keep=False)
dup3
Out[29]: 
   1  2  3
0  1  4  4



(2)df.drop_duplicates()

删除重复的行



5、DataFrame按条件筛选



(1)df [df.列名>,<, = 80]

 df[df.math>80]



(2)df.loc[df.列名>,<, = 80, : ]

df.loc[df.math>80,:]



6、DataFrame合并



(1)merge



df.merge(df1, df2, on=列名,)

df1,df2 都有相同的键值列,使用on 指定。

df1 = pd.DataFrame({'key':['d','b','a','c','a','a','d'],
                   'data':range(7)})
df2 = pd.DataFrame({'key':['a','b','d'],
                   'data':range(3)})
df1
Out[40]: 
  key  data
0   d     0
1   b     1
2   a     2
3   c     3
4   a     4
5   a     5
6   d     6
df2
Out[41]: 
  key  data
0   a     0
1   b     1
2   d     2                 
res = pd.merge(df1,df2,on = 'key')
res
Out[39]: 
  key  data_x  data_y
0   d       0       2
1   d       6       2
2   b       1       1
3   a       2       0
4   a       4       0
5   a       5       0

df1,df2 键值列不同时,可以通过left_on,right_on 分别指定。

df1 = pd.DataFrame({'lkey':['b','b','a','c','a','a','b'],
                   'data':range(7)})
df2 = pd.DataFrame({'rkey':['a','b','d'],
                   'data':range(3)})
df1
Out[43]: 
  lkey  data
0    b     0
1    b     1
2    a     2
3    c     3
4    a     4
5    a     5
6    b     6
df2
Out[44]: 
  rkey  data
0    a     0
1    b     1
2    d     2                   
res = pd.merge(df1,df2,left_on = 'lkey',right_on = 'rkey')
res
Out[45]: 
  lkey  data_x rkey  data_y
0    b       0    b       1
1    b       1    b       1
2    b       6    b       1
3    a       2    a       0
4    a       4    a       0
5    a       5    a       0

df1,df2 的键’c’,’d’都消失了,因为默认使用了内连接‘inner’,我们可以通过how=‘left’,‘right’,’outer’来指定左连接,右连接,全连接。

res = pd.merge(df1,df2,left_on = 'lkey',right_on = 'rkey',how ='outer')
res
Out[47]: 
  lkey  data_x rkey  data_y
0    b     0.0    b     1.0
1    b     1.0    b     1.0
2    b     6.0    b     1.0
3    a     2.0    a     0.0
4    a     4.0    a     0.0
5    a     5.0    a     0.0
6    c     3.0  NaN     NaN
7  NaN     NaN    d     2.0

使用on也可以是个列表,来实现针对多个键值进行合并的操作。

df1 = pd.DataFrame({'key1':['foo','foo','bar'],
                    'key2':['one','two','one'],
                   'lval':[1,2,3]})
df1
Out[49]: 
  key1 key2  lval
0  foo  one     1
1  foo  two     2
2  bar  one     3

df2 = pd.DataFrame({'key1':['foo','foo','bar','bar'],
                    'key2':['one','one','one','two'],
                    'rval':[4,5,6,7]})
df2
Out[50]: 
  key1 key2  rval
0  foo  one     4
1  foo  one     5
2  bar  one     6
3  bar  two     7                              
res = pd.merge(df1,df2,on=['key1','key2'],how ='outer')
res
Out[51]: 
  key1 key2  lval  rval
0  foo  one   1.0   4.0
1  foo  one   1.0   5.0
2  foo  two   2.0   NaN
3  bar  one   3.0   6.0
4  bar  two   NaN   7.0



(2)concat



pd.concat([df1,df2],axis=1)
参数:
    axis:连接的轴。默认0。0是上下拼接(按行,合并column相同的),1是左右拼接(按列,合并index相同的)。
import pandas as pd
data1 = {
    'name': ['张三', '李四', '王五', '赵六', '贾七'],
    'math': [68, 79, 83, 65, 92],
    'language': [85, 72, 72, 95, 88]
}
df1 = pd.DataFrame(data1, index=['a', 'b', 'c', 'd', 'e'])
df1
Out[32]: 
  name  math  language
a   张三    68        85
b   李四    79        72
c   王五    83        72
d   赵六    65        95
e   贾七    92        88
data2 ={
    'name':['张三','李四','王五','赵六','贾七'],
    'math':[88,69,83,66,97],
    'language':[75,82,67,78,56]
}
df2 = pd.DataFrame(data2,index =['c','d','a','b','e'])
df2
Out[35]: 
  name  math  language
c   张三    88        75
d   李四    69        82
a   王五    83        67
b   赵六    66        78
e   贾七    97        56
res = pd.concat([df1,df2],axis=1)  # 0或者1,默认为0。沿着连接的轴。
print(res)
name  math  language name  math  language
a   张三    68        85   王五    83        67
b   李四    79        72   赵六    66        78
c   王五    83        72   张三    88        75
d   赵六    65        95   李四    69        82
e   贾七    92        88   贾七    97        56
res = pd.concat([df1,df2])
print(res)
  name  math  language
a   张三    68        85
b   李四    79        72
c   王五    83        72
d   赵六    65        95
e   贾七    92        88
c   张三    88        75
d   李四    69        82
a   王五    83        67
b   赵六    66        78
e   贾七    97        56



版权声明:本文为sweet1194695742原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。