Pandas程序回顾

1.前言

回顾Pandas的基本操作,参照morvan tutorial。

2.安装

anaconda下,直接运行:

conda install pandas

3. 常见操作

(1)pd.date_range

生成一个list,装着数据结构的行名。

dates = pd.date_range('20200101', periods=5)  
"""
output:
DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',
               '2020-01-05'],
              dtype='datetime64[ns]', freq='D')
"""

(2)pd.DataFrame

创建一个数据结构(表)

df = pd.DataFrame(np.arange(15).reshape((5,3)), index=dates, columns=['A', 'B', 'C'])
"""
output:
             A   B   C
2020-01-01   0   1   2
2020-01-02   3   4   5
2020-01-03   6   7   8
2020-01-04   9  10  11
2020-01-05  12  13  14
"""

(3)df.Adf['A']相同

都为:

"""
output:
2020-01-01     0
2020-01-02     3
2020-01-03     6
2020-01-04     9
2020-01-05    12
Freq: D, Name: A, dtype: int32
"""

注意: df['2020-01-01']df['20200101']都是非法的,因为这种语法只针对列。

(4)df[0:2]

输出为第一到第二的数据,不是列哦!

"""
output:
            A  B  C
2020-01-01  0  1  2
2020-01-02  3  4  5
"""

(5)df['20200101':'20200103']

输出的是第一行到第三行(包含)的数据。

"""
output:
            A  B  C
2020-01-01  0  1  2
2020-01-02  3  4  5
2020-01-03  6  7  8
"""

(6)df.loc['20200101']

df['20200101':‘20200101’]这样可以获取第一行的数据,包含了行名。如果只是想获取第一行的数据,不要行名,就可以用df.loc['20200101']

"""
output:
A    0
B    1
C    2
Name: 2020-01-01 00:00:00, dtype: int32
"""

并且还以获取其中的某一列的值:

df.loc['20200101'][0]
"""
output:
0
"""

也可以获得每一列的所有数据:

df.loc[:,['A']]
"""
output:
             A
2020-01-01   0
2020-01-02   3
2020-01-03   6
2020-01-04   9
2020-01-05  12
"""

总结一下: 如果行用的索引是’20200101’这样的具体名称,则输出不会含有这个名称了,且可以通过后续索引得到具体的数值,如果是index,则输出一定含有名称了,这样就没办法通过索引来得到数值。

(7)df.iloc[1,1]

"""
output:
4
"""

注意: 只能用index进行索引哦,不能用名称,再举个例子吧:

 df.iloc[[1,2],[1,2]]
 """
output:
            B  C
2020-01-02  4  5
2020-01-03  7  8
"""

(8)注意df.ix在我使用的pandas1.0.3版本已经弃用了

(9)df.A>5

这个可以筛选出A列中大于5所在的所有行所,True表示选中。

 """
output:
2020-01-01    False
2020-01-02    False
2020-01-03     True
2020-01-04     True
2020-01-05     True
Freq: D, Name: A, dtype: bool
"""

然后可以用这个来在原始的df上进行筛选:

df[df.A>5]
 """
output:
             A   B   C
2020-01-03   6   7   8
2020-01-04   9  10  11
2020-01-05  12  13  14
"""

(10)df.loc['20200101', 'C']=8

更改数值。
如果要整体更改满足某一条件的列,则可以:

df.C[df.A>5]=np.nan
 """
output:
             A   B    C
2020-01-01   0   1  8.0
2020-01-02   3   4  5.0
2020-01-03   6   7  NaN
2020-01-04   9  10  NaN
2020-01-05  12  13  NaN
"""

如果要自定义更改的值,可以:

 """
 df.C[df.A>5]=[1,2,3]
output:
             A   B    C
2020-01-01   0   1  8.0
2020-01-02   3   4  5.0
2020-01-03   6   7  1.0
2020-01-04   9  10  2.0
2020-01-05  12  13  3.0
"""

也可以用Series创建一个index to column对,进行赋值:

 """
df.C=pd.Series([1,2,3], index=pd.date_range('20200103', periods=3))
output:
             A   B    C
2020-01-01   0   1  NaN
2020-01-02   3   4  NaN
2020-01-03   6   7  1.0
2020-01-04   9  10  2.0
2020-01-05  12  13  3.0
"""

注意:
1.pd.Series([1,2,3], index=pd.date_range('20200103', periods=3))生成的就是index to column对
2.因为更改的是整个C列,但是给的值只有后三行对应的,所以其他的空位自动被赋值为NaN

(11)df.dropna(axis=, how= )

如果整行删除,axis=0
如果整列删除,axis=1
如果要全部为NaN才删除,how=‘all’
如果出现NaN就删除,how=‘any’

df.dropna(axis=1, how='any')
"""
output:
             A   B
2020-01-01   0   1
2020-01-02   3   4
2020-01-03   6   7
2020-01-04   9  10
2020-01-05  12  13
"""

(12)df.fillna(value= )

df.fillna(value=1)
"""
output:
             A   B     C
2020-01-01   0   1   1.0
2020-01-02   3   4   1.0
2020-01-03   6   7   8.0
2020-01-04   9  10  11.0
2020-01-05  12  13  14.0
"""

注意: 尽管我给的value是integer,但是填进去的值被自动转为了与下面相同的float类型

(13)df.isnull

查看哪些是NaN,输出的是bool型,这个输出的是一个DataFrame,包含了索引和名称,所以不能使用这个进行索引哦!

(14)csv文件处理

读取csv文件:

csv = pd.read_csv('student.csv')
"""
output:
    Student ID  name   age  gender
0         1100  Kelly   22  Female
1         1101    Clo   21  Female
2         1102  Tilly   22  Female
3         1103   Tony   24    Male
4         1104  David   20    Male
5         1105  Catty   22  Female
6         1106      M    3  Female
7         1107      N   43    Male
8         1108      A   13    Male
9         1109      S   12    Male
10        1110  David   33    Male
11        1111     Dw    3  Female
12        1112      Q   23    Male
13        1113      W   21  Female
"""

可以发现,在这个表的左侧,会自动加上一个index行索引哦,方便对数据进行后续操作。
如果想更高效低读取csv文件,可以用csv.to_pickle('student.pickle'),读取.pickle文件用:

pd.read_pickle()

(15)合并表concat

df1 = pd.DataFrame(np.ones((5,3))*1, columns=['A', 'B', 'C'])
df2 = pd.DataFrame(np.ones((5,3))*2, columns=['A', 'B', 'C'])
df3 = pd.DataFrame(np.ones((5,3))*3, columns=['A', 'B', 'C'])
concate = pd.concat([df1, df2, df3], axis=0)
"""
output:
     A    B    C
0  1.0  1.0  1.0
1  1.0  1.0  1.0
2  1.0  1.0  1.0
3  1.0  1.0  1.0
4  1.0  1.0  1.0
0  2.0  2.0  2.0
1  2.0  2.0  2.0
2  2.0  2.0  2.0
3  2.0  2.0  2.0
4  2.0  2.0  2.0
0  3.0  3.0  3.0
1  3.0  3.0  3.0
2  3.0  3.0  3.0
3  3.0  3.0  3.0
4  3.0  3.0  3.0
"""

注意:
1.axis默认是0,也就是按行合并
2.如果没有给行命名,则按0开始自动命名,这样很不直观,所以需要重新排序命名:

concate = pd.concat([df1, df2, df3], axis=0, ignore_index=True)
"""
output:
      A    B    C
0   1.0  1.0  1.0
1   1.0  1.0  1.0
2   1.0  1.0  1.0
3   1.0  1.0  1.0
4   1.0  1.0  1.0
5   2.0  2.0  2.0
6   2.0  2.0  2.0
7   2.0  2.0  2.0
8   2.0  2.0  2.0
9   2.0  2.0  2.0
10  3.0  3.0  3.0
11  3.0  3.0  3.0
12  3.0  3.0  3.0
13  3.0  3.0  3.0
14  3.0  3.0  3.0
"""

注意一下,join的参数,默认是’outer’:

df1 = pd.DataFrame(np.ones((2,3))*1, index=[0,1], columns=['A', 'B', 'C'])
df2 = pd.DataFrame(np.ones((2,3))*2, index=[0,2], columns=['A', 'B', 'D'])
concate = pd.concat([df1, df2], axis=0, join='outer')
"""
output:
     A    B    C    D
0  1.0  1.0  1.0  NaN
1  1.0  1.0  1.0  NaN
0  2.0  2.0  NaN  2.0
2  2.0  2.0  NaN  2.0
"""

没有出现的地方就要补NaN了。
如果是’inner’,则只会合并相同名称的列哦:

df1 = pd.DataFrame(np.ones((2,3))*1, index=[0,1], columns=['A', 'B', 'C'])
df2 = pd.DataFrame(np.ones((2,3))*2, index=[0,2], columns=['A', 'B', 'D'])
concate = pd.concat([df1, df2], axis=0, join='inner')
"""
output:
     A    B
0  1.0  1.0
1  1.0  1.0
0  2.0  2.0
2  2.0  2.0
"""

当axis=1时:

df1 = pd.DataFrame(np.ones((2,3))*1, index=[0,1], columns=['A', 'B', 'C'])
df2 = pd.DataFrame(np.ones((2,3))*2, index=[0,2], columns=['A', 'B', 'D'])
concate = pd.concat([df1, df2], axis=1, join='inner')
"""
output:
     A    B    C    A    B    D
0  1.0  1.0  1.0  2.0  2.0  2.0
"""

在pandas1.0.3版本中,已经去掉了join_axes了。

还有一种合并的方法是append,这个和python中的列表一样,只能在最后面进行添加,所以只能进行类似axis=0的合并,并且是outer类型的哦:

df1 = pd.DataFrame(np.ones((2,3))*1, index=[0,1], columns=['A', 'B', 'C'])
df2 = pd.DataFrame(np.ones((2,3))*2, index=[0,2], columns=['A', 'B', 'D'])
df1.append([df1, df2], ignore_index=True)
"""
output:
     A    B    C    D
0  1.0  1.0  1.0  NaN
1  1.0  1.0  1.0  NaN
2  1.0  1.0  1.0  NaN
3  1.0  1.0  1.0  NaN
4  2.0  2.0  NaN  2.0
5  2.0  2.0  NaN  2.0
"""

注意:
1.append并不会改变df1的东西哦,如果要建新的表,需要另外取个名字,除了这个操作外,其余的操作都会直接改变表中的值。
2.append([df1, df2])这个是按顺序加入的哦。

或者使用下面一种形式:

df1 = pd.DataFrame(np.ones((2,3))*1, index=[0,1], columns=['A', 'B', 'C'])
new_row = pd.Series([3,4,5], index=['A', 'B', 'C'])  # 这里要列命名与df1相同,如果不命名,则得到的结果不正确
df1.append(new_row, ignore_index=True)
"""
output:
     A    B    C
0  1.0  1.0  1.0
1  1.0  1.0  1.0
2  3.0  4.0  5.0
"""

(15)合并表merge

这个与concat类似,但merge主要用于两组有key列数据的合并:

--------------to be continued--------------------2020.5.20

猜你喜欢

转载自blog.csdn.net/qq_37285386/article/details/106204236