字符串函数,Series的lower()函数
Series在str属性中提供了一组字符串处理方法,可以方便地对数组中的每个元素进行操作,如下面的代码片段所示。请注意,str中的模式匹配通常默认使用正则表达式(在某些情况下总是使用正则表达式)
import numpy as np
import pandas as pd
s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])
print(s.str.lower())
输出结果为:
0 a
1 b
2 c
3 aaba
4 baca
5 NaN
6 caba
7 dog
8 cat
dtype: object
数据合并
concat
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randn(10,4))
print(df)
print("------------------------------------")
print(df[:3])
#pieces = [df[]]
print("------------------------------------")
print(df[3:7])
print("------------------------------------")
print(df[7:])
pieces = [df[:3],df[3:7],df[7:]]
print("------------------------------------")
print(pieces)
print(pd.concat(pieces))
输出结果:
0 1 2 3
0 1.190317 0.751029 1.628000 -0.923804
1 0.926196 1.644827 -1.005915 -0.153604
2 -1.082964 -0.684693 -0.087294 0.707919
3 -0.418695 2.392404 1.020161 0.928821
4 0.798035 -0.458987 -0.612861 0.589815
5 0.749647 -0.939293 -1.883342 -1.408095
6 0.045482 2.362426 -0.792240 -0.127324
7 0.881938 -1.667338 -0.147447 0.529441
8 -1.768780 -1.513335 -0.014616 0.373453
9 -0.553334 -0.066471 -0.367330 -0.815094
------------------------------------
0 1 2 3
0 1.190317 0.751029 1.628000 -0.923804
1 0.926196 1.644827 -1.005915 -0.153604
2 -1.082964 -0.684693 -0.087294 0.707919
------------------------------------
0 1 2 3
3 -0.418695 2.392404 1.020161 0.928821
4 0.798035 -0.458987 -0.612861 0.589815
5 0.749647 -0.939293 -1.883342 -1.408095
6 0.045482 2.362426 -0.792240 -0.127324
------------------------------------
0 1 2 3
7 0.881938 -1.667338 -0.147447 0.529441
8 -1.768780 -1.513335 -0.014616 0.373453
9 -0.553334 -0.066471 -0.367330 -0.815094
------------------------------------
[ 0 1 2 3
0 1.190317 0.751029 1.628000 -0.923804
1 0.926196 1.644827 -1.005915 -0.153604
2 -1.082964 -0.684693 -0.087294 0.707919, 0 1 2 3
3 -0.418695 2.392404 1.020161 0.928821
4 0.798035 -0.458987 -0.612861 0.589815
5 0.749647 -0.939293 -1.883342 -1.408095
6 0.045482 2.362426 -0.792240 -0.127324, 0 1 2 3
7 0.881938 -1.667338 -0.147447 0.529441
8 -1.768780 -1.513335 -0.014616 0.373453
9 -0.553334 -0.066471 -0.367330 -0.815094]
0 1 2 3
0 1.190317 0.751029 1.628000 -0.923804
1 0.926196 1.644827 -1.005915 -0.153604
2 -1.082964 -0.684693 -0.087294 0.707919
3 -0.418695 2.392404 1.020161 0.928821
4 0.798035 -0.458987 -0.612861 0.589815
5 0.749647 -0.939293 -1.883342 -1.408095
6 0.045482 2.362426 -0.792240 -0.127324
7 0.881938 -1.667338 -0.147447 0.529441
8 -1.768780 -1.513335 -0.014616 0.373453
9 -0.553334 -0.066471 -0.367330 -0.815094
merge
import numpy as np
import pandas as pd
left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})
print(left)
right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})
print(right)
print(pd.merge(left,right,on='key'))
输出结果为:
key lval
0 foo 1
1 foo 2
key rval
0 foo 4
1 foo 5
key lval rval
0 foo 1 4
1 foo 1 5
2 foo 2 4
3 foo 2 5
分组
groupby
按照指定列进行分组,有点类似sql语句里面的分组的概念的样子
import numpy as np
import pandas as pd
df = pd.DataFrame({'A':['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
'B':['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
'C':np.random.randn(8),
'D':np.random.randn(8)})
print(df)
print("-----------------------------------")
print(df.groupby('A').sum())
print("-----------------------------------")
print(df.groupby(['A', 'B']).sum())
输出结果为:
A B C D
0 foo one -0.411487 -0.908131
1 bar one 0.803172 -0.093416
2 foo two 0.079114 -0.594352
3 bar three -1.423867 -0.025747
4 foo two 0.832108 0.818305
5 bar two 0.551068 -0.859953
6 foo one -1.052481 -0.220297
7 foo three -2.639817 0.402972
-----------------------------------
C D
A
bar -0.069626 -0.979116
foo -3.192563 -0.501502
-----------------------------------
C D
A B
bar one 0.803172 -0.093416
three -1.423867 -0.025747
two 0.551068 -0.859953
foo one -1.463968 -1.128427
three -2.639817 0.402972
two 0.911223 0.223953
Reshaping
import numpy as np
import pandas as pd
tuples = list(zip(*[['bar', 'bar', 'baz', 'baz',
'foo', 'foo', 'qux', 'qux'],
['one', 'two', 'one', 'two',
'one', 'two', 'one', 'two']]))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
print(index)
df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=['A', 'B'])
df2 = df[:4]
print(df2)
print("---------df2.stack()------------------")
stacked = df2.stack()
print(stacked)
print("---------stacked.unstack()------------")
print(stacked.unstack())
print("---------stacked.unstack(1)-----------")
print(stacked.unstack(1))
print("---------stacked.unstack(0)-----------")
print(stacked.unstack(0))
输出结果为 :
MultiIndex([('bar', 'one'),
('bar', 'two'),
('baz', 'one'),
('baz', 'two'),
('foo', 'one'),
('foo', 'two'),
('qux', 'one'),
('qux', 'two')],
names=['first', 'second'])
A B
first second
bar one 0.189887 0.637367
two -0.341858 -0.895612
baz one 0.517839 -0.798281
two -0.712129 -1.355618
---------df2.stack()------------------
first second
bar one A 0.189887
B 0.637367
two A -0.341858
B -0.895612
baz one A 0.517839
B -0.798281
two A -0.712129
B -1.355618
dtype: float64
---------stacked.unstack()------------
A B
first second
bar one 0.189887 0.637367
two -0.341858 -0.895612
baz one 0.517839 -0.798281
two -0.712129 -1.355618
---------stacked.unstack(1)-----------
second one two
first
bar A 0.189887 -0.341858
B 0.637367 -0.895612
baz A 0.517839 -0.712129
B -0.798281 -1.355618
---------stacked.unstack(0)-----------
first bar baz
second
one A 0.189887 0.517839
B 0.637367 -0.798281
two A -0.341858 -0.712129
B -0.895612 -1.355618
Pivot tables
import numpy as np
import pandas as pd
df = pd.DataFrame({'A': ['one', 'one', 'two', 'three'] * 3,
'B':['A','B','C'] * 4,
'C': ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 2,
'D':np.random.randn(12),
'E':np.random.randn(12)})
print(df)
print("-------------------------------")
print(pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C']))
输出结果为:
A B C D E
0 one A foo -0.282109 1.696844
1 one B foo 0.715732 0.283795
2 two C foo 0.889333 0.621878
3 three A bar -1.065137 1.184847
4 one B bar 0.420288 -0.299934
5 one C bar -1.269725 -1.261542
6 two A foo 1.142230 1.887502
7 three B foo -0.456574 0.650669
8 one C foo -0.146470 -0.307011
9 one A bar 0.944573 0.967164
10 two B bar 0.432492 -0.554618
11 three C bar -1.928619 -1.158268
-------------------------------
C bar foo
A B
one A 0.944573 -0.282109
B 0.420288 0.715732
C -1.269725 -0.146470
three A -1.065137 NaN
B NaN -0.456574
C -1.928619 NaN
two A NaN 1.142230
B 0.432492 NaN
C NaN 0.889333
时间处理
panda具有在频率转换期间执行重采样操作的简单、强大和高效的功能(例如,,将第二个数据转换为5分钟数据)。这在金融应用程序中非常常见,但不限于此。
import numpy as np
import pandas as pd
rng = pd.date_range('1/1/2012',periods=100,freq='S')
ts = pd.Series(np.random.randint(0,500,len(rng)),index=rng)
print(ts.resample('5Min').sum())
print("---------------------date_range-------------------------")
rng = pd.date_range('3/6/2012 00:00',periods=5,freq='D')
ts = pd.Series(np.random.randn(len(rng)),rng)
print(ts)
print("----------------------tz_localize-----------------------")
ts_utc = ts.tz_localize('UTC')
print(ts_utc)
print("------------转换成其它时区的值---------------------------")
print(ts_utc.tz_convert('US/Eastern'))
print("------------在时间跨度表示之间进行转换-------------------")
rng = pd.date_range('1/1/2012',periods=5,freq='M')
ts = pd.Series(np.random.randn(len(rng)),index=rng)
print(ts)
print("----------------to_period------------------------------")
ps = ts.to_period()
print(ts)
print("----------------to_timestamp---------------------------")
print(ps.to_timestamp())
print("------------------------------------------------------")
prng = pd.period_range('1990Q1', '2000Q4', freq='Q-NOV')
ts = pd.Series(np.random.randn(len(prng)), prng)
ts.index = (prng.asfreq('M', 'e') + 1).asfreq('H', 's') + 9
print(ts.head())
输出结果为:
2012-01-01 24102
Freq: 5T, dtype: int32
---------------------date_range-------------------------
2012-03-06 0.059085
2012-03-07 0.216838
2012-03-08 -1.465363
2012-03-09 -0.349098
2012-03-10 -0.818129
Freq: D, dtype: float64
----------------------tz_localize-----------------------
2012-03-06 00:00:00+00:00 0.059085
2012-03-07 00:00:00+00:00 0.216838
2012-03-08 00:00:00+00:00 -1.465363
2012-03-09 00:00:00+00:00 -0.349098
2012-03-10 00:00:00+00:00 -0.818129
Freq: D, dtype: float64
------------转换成其它时区的值---------------------------
2012-03-05 19:00:00-05:00 0.059085
2012-03-06 19:00:00-05:00 0.216838
2012-03-07 19:00:00-05:00 -1.465363
2012-03-08 19:00:00-05:00 -0.349098
2012-03-09 19:00:00-05:00 -0.818129
Freq: D, dtype: float64
------------在时间跨度表示之间进行转换-------------------
2012-01-31 -0.682776
2012-02-29 0.895222
2012-03-31 -0.162116
2012-04-30 -1.175630
2012-05-31 -0.936218
Freq: M, dtype: float64
----------------to_period------------------------------
2012-01-31 -0.682776
2012-02-29 0.895222
2012-03-31 -0.162116
2012-04-30 -1.175630
2012-05-31 -0.936218
Freq: M, dtype: float64
----------------to_timestamp---------------------------
2012-01-01 -0.682776
2012-02-01 0.895222
2012-03-01 -0.162116
2012-04-01 -1.175630
2012-05-01 -0.936218
Freq: MS, dtype: float64
------------------------------------------------------
1990-03-01 09:00 1.847485
1990-06-01 09:00 -0.909369
1990-09-01 09:00 1.381791
1990-12-01 09:00 0.997901
1991-03-01 09:00 1.470387
Freq: H, dtype: float64
Categoricals
在pandas的DataFrame中包括categorical 数据.
import numpy as np
import pandas as pd
df = pd.DataFrame({"id": [1, 2, 3, 4, 5, 6],
"raw_grade":['a','b','b','a','a','e']})
print("-----------将原始等级转换为分类数据类型-------------")
df["grade"] = df["raw_grade"].astype("category")
print(df["grade"])
# 重新命名这个分类范畴为更有意义的名字
print("-------重新命名这个分类范畴为更有意义的名字----------")
df["grade"].cat.categories = ["very good", "good", "very bad"]
df["grade"] = df["grade"].cat.set_categories(["very bad", "bad", "medium",
"good","very good"])
print(df["grade"])
print("-----按照分类中的[very bad, bad, medium, good, very good]范畴进行排序----")
print(df.sort_values(by="grade"))
print("-----按照分类中的[very bad, bad, medium, good, very good]范畴进行排序,并且显示空数据的值----")
print(df.groupby('grade').size())
输出结果:
-----------将原始等级转换为分类数据类型-------------
0 a
1 b
2 b
3 a
4 a
5 e
Name: grade, dtype: category
Categories (3, object): [a, b, e]
-------重新命名这个分类范畴为更有意义的名字----------
0 very good
1 good
2 good
3 very good
4 very good
5 very bad
Name: grade, dtype: category
Categories (5, object): [very bad, bad, medium, good, very good]
-----按照分类中的[very bad, bad, medium, good, very good]范畴进行排序----
id raw_grade grade
5 6 e very bad
1 2 b good
2 3 b good
0 1 a very good
3 4 a very good
4 5 a very good
-----按照分类中的[very bad, bad, medium, good, very good]范畴进行排序,并且显示空数据的值----
grade
very bad 1
bad 0
medium 0
good 2
very good 3
dtype: int64