Loading

pandas模块

  • series的map方法

对某列中的数据集中进行某个操作

比如对gende这一列,将显示为男的替换为1,女的替换为0

#①使用字典进行映射
data["gender"] = data["gender"].map({"男":1, "女":0})
​
#②使用函数
def gender_map(x):
    gender = 1 if x == "男" else 0
    return gender
#注意这里传入的是函数名,不带括号
data["gender"] = data["gender"].map(gender_map)

 

可以使用字典映射,字典表示了一种替换规则,键为列中迭代的元素,值为需要进行的操作

(字典需要列出列中所有想要操作的元素来进行替换)

也可以使用函数,函数的传入参数就是列中的所有元素,比如上文的x

函数的返回值就是需要对列中所有元素替换的值

 

 

 

不论是利用字典还是函数进行映射,map方法都是把对应的数据逐个当作参数传入到字典或函数中,得到映射后的值。

  • series的apply方法

map方法只能传入一个参数,也就是列中所有的元素

apply方法可以接受多个参数,也就是说这个自定义函数可以指定除列元素本身的其他参数

def apply_age(x,bias):
    return x+bias
#以元组的方式传入额外的参数
data["age"] = data["age"].apply(apply_age,args=(-3,))
  • Datafram中的apply方法

DataFrame对象的大多数方法中,都会有axis这个参数,它控制了你指定的操作是沿着0轴还是1轴进行

axis=0代表操作对列columns进行,axis=1代表操作对行row进行(纵向为0轴,横向为1轴)

(与series的apply方法相比,其可以直接对多行或者多列进行操作)

使用内置函数np.sum和np.log来对列元素进行操作,内置函数会将前面的列元素(各列实际上都变成series,此处有好几个series,对每个series分别进行计算)都作为参数进行求和

注意np.sum和np.log返回的结果格式是不一样的

np.sum对1个series计算只会返回1个值,此处传入3个series,则获得了3个值,返回1个series

可以使用data['result']来接收

np.log对1个serie返回所有列元素对应的值,此处传入3个series,则获得了3*列长度个值,返回3个series

可以使用data[['height_log','weight_log','age_log']]来接收

# 沿着0轴求和
data[["height","weight","age"]].apply(np.sum, axis=0)
# 沿着0轴取对数
data[["height","weight","age"]].apply(np.log, axis=0)

 

 

 

 

 

 

def BMI(series):
    weight = series["weight"]
    height = series["height"]/100
    BMI = weight/height**2
    return BMI
data["BMI"] = data.apply(BMI,axis=1)
# 返回的值可以使用单独的列来进行承接,也可以直接在原列上进行替换
# 此处的传出数据为一列

注意函数参数是单个series(因为axis为1,此时就是一行),函数内部使用列索引(就是取行内的单个元素),返回的为单个series

(如果axis为0,此时就是一列,使用行索引来确定单个元素进行计算,dataframe的特殊之处就在此,其需要在函数内部再去索引来确定使用的元素类型)

  •  Dataframe中的applymap

df.applymap(lambda x:"%.2f" % x)

该方法的作用是为Dataframe中的所有参数都套用这个函数

  •  groupby
group = data.groupby("company")

 

其会按照company这一项进行分类,此时group是一个DataFrameGroupBy对象,包含了多个子Dataframe

可以用于agg聚合操作,其也会返回一个dataframe来表示结果,有多少分组则会有多少行

In [12]: data.groupby("company").agg('mean')
Out[12]:
         salary    age
company
A         21.50  27.50
B         13.00  29.00
C         29.25  27.25

 可以使用字典来指定不同的列执行不同的聚合目标

In [17]: data.groupby('company').agg({'salary':'median','age':'mean'})
Out[17]:
         salary    age
company
A          21.5  27.50
B          10.0  29.00
C          30.0  27.25

 

  •  transform操作

按照groupby后的子dataframe中salary项求平均值,然后每个group会得到一个salary的均值结果

transform会对同一组的每一条数据填充相同的结果(agg会把同一个组的多个元素合并为一组展示结果,而transform则是同时填充多个相同结果)

 data['avg_salary'] = data.groupby('company')['salary'].transform('mean')
​
data

  company  salary  age  avg_salary
0       C      43   35       29.25
1       C      17   25       29.25
2       C       8   30       29.25
3       A      20   22       21.50
4       B      10   17       13.00
5       B      21   40       13.00
6       A      23   33       21.50
7       C      49   19       29.25
8       B       8   30       13.00
    

 

  • 时间序列操作

Pandas时序处理中最常见的两种数据类型为datetimetimedelta

 datetime顾名思义就是既有日期date也有时间time,表示一个具体的时间点(时间戳)

timedelta则表示两个时间点之间的差,比如2020-01-012020-01-02之间的timedelta即为一天

使用如下方式,可以将文件中时间格式转换为pandas中的datetime64类型

data["trade_date"] = pd.to_datetime(data.trade_date)
data.trade_date.head()

0   2019-01-02
1   2019-01-03
2   2019-01-04
3   2019-01-07
4   2019-01-08
Name: trade_date, dtype: datetime64[ns]

 使用如下方式可以直接进行索引,而不需要去进行时间值的转换

data1 = data.set_index("trade_date")

# 2019年6月的数据
data1.loc["2019-06"].head()
                close       open       high        low
trade_date
2019-06-03  2890.0809  2901.7424  2920.8292  2875.9019
2019-06-04  2862.2803  2887.6405  2888.3861  2851.9728
2019-06-05  2861.4181  2882.9369  2888.7676  2858.5719
2019-06-06  2827.7978  2862.3327  2862.3327  2822.1853
2019-06-10  2852.1302  2833.0145  2861.1310  2824.3554

# 2019年6月-2019年8月的数据
data1.loc["2019-06":"2019-08"].tail()
                close       open       high        low
trade_date
2019-08-26  2863.5673  2851.0158  2870.4939  2849.2381
2019-08-27  2902.1932  2879.5154  2919.6444  2879.4060
2019-08-28  2893.7564  2901.6267  2905.4354  2887.0115
2019-08-29  2890.9192  2895.9991  2898.6046  2878.5878
2019-08-30  2886.2365  2907.3825  2914.5767  2874.1028

时间序列的属性

# 一年中的第几天
data.trade_date.dt.dayofweek[0]
# 2

# 返回对应日期
data.trade_date.dt.date[0]
# datetime.date(2019, 1, 2)

# 返回周数
data.trade_date.dt.weekofyear[0]
# 1

# 返回周几
data.trade_date.dt.weekday_name[0]
# 'Wednesday'

 

 

可以使用datetime模块进行更加细致的操作,详见datetime模块

 

 

 

 

 

 

 

 

posted @ 2020-10-29 18:04  lixin2020  阅读(124)  评论(0)    收藏  举报