Python 常用模块系列:
- [Python] 常用模块(1):内建模块 – random & datetime
- [Python] 常用模块(2):内建模块 – re 以及正则表达式
- [Python] 常用模块(3):内建模块 – math & itertools
- [Python] 常用模块(4):NumPy 上
- [Python] 常用模块(4):NumPy 中
- [Python] 常用模块(4):NumPy 下
- [Python] 常用模块(5):pandas 1
- [Python] 常用模块(5):pandas 2
- [Python] 常用模块(5):pandas 3
- [Python] 常用模块(5):pandas 4
- [Python] 常用模块(5):pandas 5(本文)
- [Python] 常用模块(5):pandas 6
- [Python] 常用模块(5):pandas 7
- [Python] 常用模块(5):pandas 8
- [Python] 常用模块(5):pandas 9
文章目录
数据框的功能函数
功能的映射:df.apply(func, axis = 0)
对数据框的每一行或列使用相同的功能处理。
>>> df = pd.DataFrame([[4, 9],] * 3, columns=['A', 'B'])
>>> df
A B
0 4 9
1 4 9
2 4 9
>>> df.apply(np.sqrt)
A B
0 2.0 3.0
1 2.0 3.0
2 2.0 3.0
对数据框的每一行或列进行合并功能的处理:df.agg(func, axis = 0)
>>> df = pd.DataFrame([[1, 2, 3],
... [4, 5, 6],
... [7, 8, 9],
... [np.nan, np.nan, np.nan]],
... columns=['A', 'B', 'C'])
>>> df.agg(['sum', 'min'])
A B C
sum 12.0 15.0 18.0
min 1.0 2.0 3.0
数据框的分组:df.groupby(by = None, axis = 0)
首先可以创建一个 groupby 对象。
>>> df = pd.DataFrame({"A":np.random.randint(0, 4, 5),
... "B":np.random.randn(5),
... "name":["a", "b", "a", "b", "b"]})
>>> print(df)
A B name
0 1 -0.549746 a
1 3 -1.402873 b
2 0 1.582752 a
3 0 -1.045147 b
4 3 0.257594 b
>>> print(df.groupby("name"))
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x115b67be0>
分组的遍历:
分组在理论上可以看成一个 iterator,这个 iterator 有两个元素,组名和组内元素:
>>> for name, group in df.groupby('name'):
... print(name)
... print(group)
a
A B name
0 1 -0.549746 a
2 0 1.582752 a
b
A B name
1 3 -1.402873 b
3 0 -1.045147 b
4 3 0.257594 b
分组的处理
可以直接在 groupby
语句后接函数,也可以后接 agg
传递函数,不能进行处理的列会自动去掉。
>>> print(df.groupby("name").sum())
A B
name
a 1 1.033006
b 6 -2.190426
>>> print(df.groupby("name").agg(["mean", "std"]))
A B
mean std mean std
name
a 0.5 0.707107 0.516503 1.507904
b 2.0 1.732051 -0.730142 0.873904
时间序列
创建一个日期序列:df.date_range(start = None, end = None, periods = None, freq = None, tz = None)
start
定义了开始时间,end
定义了结束时间,periods
定义了时间跨度,freq
定义了频率,tz
定义了时区。
- 定义了
start
和end
,系统会自动判断频率:
>>> print(pd.date_range("1/1/2019", "1/4/2019"))
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04'], dtype='datetime64[ns]', freq='D')
- 定义了
start
或end
和periods
,系统默认频率为日:
>>> print(pd.date_range("1/1/2019", periods = 3))
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03'], dtype='datetime64[ns]', freq='D')
- 定义了
start
,end
和freq
,系统会根据freq
平均时间跨度,freq
可以取倍数:
>>> print(pd.date_range("1/1/2019", "1/31/2019", freq = "10D"))
DatetimeIndex(['2019-01-01', '2019-01-11', '2019-01-21', '2019-01-31'], dtype='datetime64[ns]', freq='10D')
- 可以定义时区
tz
,默认为 “UTC”:
>>> print(pd.date_range("1/1/2019", "1/2/2019", tz = 'America/New_York'))
DatetimeIndex(['2019-01-01 00:00:00-05:00', '2019-01-02 00:00:00-05:00'], dtype='datetime64[ns, America/New_York]', freq='D')
完整时区列表可以在 pytz
包里找到。
>>> impost pytz
> print((pytz.all_timezones[:5]))
['Africa/Abidjan', 'Africa/Accra', 'Africa/Addis_Ababa', 'Africa/Algiers', 'Africa/Asmara']
将数据转换成时间:pd.to_datetime(arg, format = None)
arg 是转换的对象,接受整数,浮点,字符串,时间序列,列表,元组,一维数组和序列;format 定义了对象的格式,若未给定则系统会自动判断。
>>> print(pd.to_datetime(["1/1/2019"]))
DatetimeIndex(['2019-01-01'], dtype='datetime64[ns]', freq=None)