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重新分组