Python之pandas用法

Python之pandas用法

导入

import pandas as pd

Series

用pandas的Series函数从数组或列表中创建一个可自定义下标(index)并自动维护标号索引的一维数组

a = pd.Series([0.25, 0.5, 0.75, 1.0])
print(a)
b = pd.Series([0.25, 0.5, 0.75, 1.0], index=['a', 'b', 'c', 'd']) # 自定义下标
print(b)
c = pd.Series({'a': 0.25, 'b': 0.5, 'c': 0.75, 'd': 1.0}) # 从dict创建
print(c)
'''
输出
0    0.25
1    0.50
2    0.75
3    1.00
dtype: float64
a    0.25
b    0.50
c    0.75
d    1.00
dtype: float64
a    0.25
b    0.50
c    0.75
d    1.00
dtype: float64
'''

其中index和values都是可迭代的对象,并且可以像dict那样进行下标访问

print(a.values)
print(b.index)
print(c['b'])
'''
输出
[0.25 0.5  0.75 1.  ]
Index(['a', 'b', 'c', 'd'], dtype='object')
0.5
'''

这里有一些小trick

print(b[b > 0.7] * 2)
print(c.sort_values) # 按value排序
print(b[1:3]) # 切片的下标对应的是自动维护的标号索引
'''
输出
c    1.5
d    2.0
dtype: float64
<bound method Series.sort_values of a    0.25
b    0.50
c    0.75
d    1.00
dtype: float64>
b    0.50
c    0.75
dtype: float64
'''

用loc和iloc分别表示访问自定义索引和自动维护的标号索引

data = pd.Series(['a', 'b', 'c'], index=[1, 3, 5])
print(data.loc[1])
print(data.iloc[1])
''' 
输出
a
b
'''

Series可以更新索引,如果一个旧索引在新索引中没有出现过,则会被除去;若一个新索引在旧索引中没有出现,就会显示NaN(not a number),表示缺失。

sdata = {'a': 1, 'b': 3, 'c': 5, 'd': 7}
obj1 = pd.Series(sdata)
print(obj1)
states = ['b', 'c', 'd', 'e']
obj2 = pd.Series(sdata, index=states)
print(obj2)
'''
输出
a    1
b    3
c    5
d    7
dtype: int64
b    3.0
c    5.0
d    7.0
e    NaN
dtype: float64
'''

Series还会根据运算的索引标签自动对齐数据

print(obj1 + obj2)
'''
输出
a     NaN
b     6.0
c    10.0
d    14.0
e     NaN
dtype: float64
'''

DataFrame

用多个Series的组合生成DataFrame

tag1_dict = {'a': 1, 'b': 2, 'c': 3}
tag1 = pd.Series(tag1_dict)
tag2_dict = {'b': 11, 'c': 12, 'd': 13}
tag2 = pd.Series(tag2_dict)
df = pd.DataFrame({'tag1': tag1, 'tag2': tag2})
print(df)
'''
输出
   tag1  tag2
a   1.0   NaN
b   2.0  11.0
c   3.0  12.0
d   NaN  13.0
'''

用词典的列表生成DataFrame

data = [{'a': i, 'b': i * 2} for i in range(3)]
print(pd.DataFrame(data))
'''
输出
   a  b
0  0  0
1  1  2
2  2  4
'''

用一个numpy的二维数组生成DataFrame,并自定义行和列索引

print(pd.DataFrame(np.random.rand(3, 2), columns=['a', 'b'], index=['c', 'd', 'e']))
'''
输出
          a         b
c  0.341337  0.379886
d  0.968444  0.595278
e  0.207694  0.440617
'''

获取一列

print(df.tag1)
print(df['tag1'])
'''
输出
a    1.0
b    2.0
c    3.0
d    NaN
Name: tag1, dtype: float64
a    1.0
b    2.0
c    3.0
d    NaN
Name: tag1, dtype: float64
'''

直接新添加一列

df['tag3'] = df['tag1'] + df['tag2']
print(df)
'''
输出
   tag1  tag2  tag3
a   1.0   NaN   NaN
b   2.0  11.0  13.0
c   3.0  12.0  15.0
d   NaN  13.0   NaN
'''

行列互换

s = df.T
print(s)
'''
输出
        a     b     c     d
tag1  1.0   2.0   3.0   NaN
tag2  NaN  11.0  12.0  13.0
tag3  NaN  13.0  15.0   NaN
'''

筛选

print(df.loc[df.tag2 > 11, ['tag1', 'tag2']])
'''
输出
   tag1  tag2
c   3.0  12.0
d   NaN  13.0
'''

赋值

df.iloc[1, 1] = 100
print(df)
'''
输出
   tag1   tag2  tag3
a   1.0    NaN   NaN
b   2.0  100.0  13.0
c   3.0   12.0  15.0
d   NaN   13.0   NaN
'''

可以在numpy的函数中直接传入一个DataFrame,相当于把函数作用于其中的所有值

df = pd.DataFrame(np.random.randint(0, 10, (2, 3)), columns=['a', 'b', 'c'])
print(np.sin(df * np.pi / 4))
'''
输出
     a         b         c
0 -1.0  0.707107 -1.000000
1 -1.0  0.707107 -0.707107
'''

DataFrame之间的运算自动进行索引对其和补足

df1 = pd.DataFrame(np.random.randint(0, 3, (2, 2)), columns=['a', 'b'])
df2 = pd.DataFrame(np.random.randint(0, 3, (2, 2)), columns=['b', 'c'])
print(df1 + df2)
print(df1.add(df2, fill_value=100))
'''
输出
    a  b   c
0 NaN  3 NaN
1 NaN  2 NaN
       a  b      c
0  100.0  3  102.0
1  101.0  2  101.0
'''

DataFrame与Series进行计算,相当于按行或按列广播

df = pd.DataFrame(np.random.randint(0, 10, (2, 2)), columns=['a', 'b'])
print(df)
print(df - df.iloc[1])
'''
输出
   a  b
0  3  8
1  4  5
   a  b
0 -1  3
1  0  0
'''

各种函数

isnull()和notnull()

作用:查找和判断NaN

fillna()

作用:替换NaN

dropna()

作用:删除NaN所在的行或列

concat()和merge()

作用:合并DataFrame

stack()和unstack()

作用:对索引堆叠或展开

groupby()

作用:对DataFrame重新分组

相关推荐