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重新分组
相关推荐
三石 2020-10-30
roamer 2020-10-29
三石 2020-10-29
wangquannuaa 2020-10-15
wangquannuaa 2020-09-29
jzlixiao 2020-09-15
wangquannuaa 2020-08-30
三石 2020-08-23
逍遥友 2020-08-21
jzlixiao 2020-08-18
wangquannuaa 2020-08-17
QianYanDai 2020-08-16
cjsyrwt 2020-08-14
jzlixiao 2020-07-29
xirongxudlut 2020-07-20
mmmjyjy 2020-07-16
QianYanDai 2020-07-05
QianYanDai 2020-07-05
june0 2020-07-04