Pandas級聯
Pandas提供了各種工具(功能),可以輕鬆地將Series
,DataFrame
和Panel
對象組合在一起。
pd.concat(objs,axis=0,join='outer',join_axes=None,
ignore_index=False)
其中,
- objs - 這是Series,DataFrame或Panel對象的序列或映射。
- axis -
{0,1,...}
,默認爲0
,這是連接的軸。 - join -
{'inner', 'outer'}
,默認inner
。如何處理其他軸上的索引。聯合的外部和交叉的內部。 - ignore_index − 布爾值,默認爲
False
。如果指定爲True
,則不要使用連接軸上的索引值。結果軸將被標記爲:0,...,n-1
。 - join_axes - 這是Index對象的列表。用於其他
(n-1)
軸的特定索引,而不是執行內部/外部集邏輯。
連接對象
concat()
函數完成了沿軸執行級聯操作的所有重要工作。下面代碼中,創建不同的對象並進行連接。
import pandas as pd
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
rs = pd.concat([one,two])
print(rs)
執行上面示例代碼,得到以下結果 -
Marks_scored Name subject_id
1 98 Alex sub1
2 90 Amy sub2
3 87 Allen sub4
4 69 Alice sub6
5 78 Ayoung sub5
1 89 Billy sub2
2 80 Brian sub4
3 79 Bran sub3
4 97 Bryce sub6
5 88 Betty sub5
假設想把特定的鍵與每個碎片的DataFrame關聯起來。可以通過使用鍵參數來實現這一點 -
import pandas as pd
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
rs = pd.concat([one,two],keys=['x','y'])
print(rs)
執行上面示例代碼,得到以下結果 -
Marks_scored Name subject_id
x 1 98 Alex sub1
2 90 Amy sub2
3 87 Allen sub4
4 69 Alice sub6
5 78 Ayoung sub5
y 1 89 Billy sub2
2 80 Brian sub4
3 79 Bran sub3
4 97 Bryce sub6
5 88 Betty sub5
結果的索引是重複的; 每個索引重複。如果想要生成的對象必須遵循自己的索引,請將ignore_index
設置爲True
。參考以下示例代碼 -
import pandas as pd
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
rs = pd.concat([one,two],keys=['x','y'],ignore_index=True)
print(rs)
執行上面示例代碼,得到以下結果 -
Marks_scored Name subject_id
0 98 Alex sub1
1 90 Amy sub2
2 87 Allen sub4
3 69 Alice sub6
4 78 Ayoung sub5
5 89 Billy sub2
6 80 Brian sub4
7 79 Bran sub3
8 97 Bryce sub6
9 88 Betty sub5
觀察,索引完全改變,鍵也被覆蓋。如果需要沿axis=1
添加兩個對象,則會添加新列。
import pandas as pd
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
rs = pd.concat([one,two],axis=1)
print(rs)
執行上面示例代碼,得到以下結果 -
Marks_scored Name subject_id Marks_scored Name subject_id
1 98 Alex sub1 89 Billy sub2
2 90 Amy sub2 80 Brian sub4
3 87 Allen sub4 79 Bran sub3
4 69 Alice sub6 97 Bryce sub6
5 78 Ayoung sub5 88 Betty sub5
使用附加連接
連接的一個有用的快捷方式是在Series和DataFrame實例的append
方法。這些方法實際上早於concat()
方法。 它們沿axis=0
連接,即索引 -
import pandas as pd
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
rs = one.append(two)
print(rs)
執行上面示例代碼,得到以下結果 -
Marks_scored Name subject_id
1 98 Alex sub1
2 90 Amy sub2
3 87 Allen sub4
4 69 Alice sub6
5 78 Ayoung sub5
1 89 Billy sub2
2 80 Brian sub4
3 79 Bran sub3
4 97 Bryce sub6
5 88 Betty sub5
append()
函數也可以帶多個對象 -
import pandas as pd
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
rs = one.append([two,one,two])
print(rs)
執行上面示例代碼,得到以下結果 -
Marks_scored Name subject_id
1 98 Alex sub1
2 90 Amy sub2
3 87 Allen sub4
4 69 Alice sub6
5 78 Ayoung sub5
1 89 Billy sub2
2 80 Brian sub4
3 79 Bran sub3
4 97 Bryce sub6
5 88 Betty sub5
1 98 Alex sub1
2 90 Amy sub2
3 87 Allen sub4
4 69 Alice sub6
5 78 Ayoung sub5
1 89 Billy sub2
2 80 Brian sub4
3 79 Bran sub3
4 97 Bryce sub6
5 88 Betty sub5
時間序列
Pandas爲時間序列數據的工作時間提供了一個強大的工具,尤其是在金融領域。在處理時間序列數據時,我們經常遇到以下情況 -
- 生成時間序列
- 將時間序列轉換爲不同的頻率
Pandas提供了一個相對緊湊和自包含的工具來執行上述任務。
獲取當前時間
datetime.now()
用於獲取當前的日期和時間。
import pandas as pd
print pd.datetime.now()
上述代碼執行結果如下 -
2017-11-03 02:17:45.997992
創建一個時間戳
時間戳數據是時間序列數據的最基本類型,它將數值與時間點相關聯。 對於Pandas對象來說,意味着使用時間點。舉個例子 -
import pandas as pd
time = pd.Timestamp('2018-11-01')
print(time)
執行上面示例代碼,得到以下結果 -
2018-11-01 00:00:00
也可以轉換整數或浮動時期。這些的默認單位是納秒(因爲這些是如何存儲時間戳的)。 然而,時代往往存儲在另一個可以指定的單元中。 再舉一個例子 -
import pandas as pd
time = pd.Timestamp(1588686880,unit='s')
print(time)
執行上面示例代碼,得到以下結果 -
2020-05-05 13:54:40
創建一個時間範圍
import pandas as pd
time = pd.date_range("12:00", "23:59", freq="30min").time
print(time)
執行上面示例代碼,得到以下結果 -
[datetime.time(12, 0) datetime.time(12, 30) datetime.time(13, 0)
datetime.time(13, 30) datetime.time(14, 0) datetime.time(14, 30)
datetime.time(15, 0) datetime.time(15, 30) datetime.time(16, 0)
datetime.time(16, 30) datetime.time(17, 0) datetime.time(17, 30)
datetime.time(18, 0) datetime.time(18, 30) datetime.time(19, 0)
datetime.time(19, 30) datetime.time(20, 0) datetime.time(20, 30)
datetime.time(21, 0) datetime.time(21, 30) datetime.time(22, 0)
datetime.time(22, 30) datetime.time(23, 0) datetime.time(23, 30)]
改變時間的頻率
import pandas as pd
time = pd.date_range("12:00", "23:59", freq="H").time
print(time)
執行上面示例代碼,得到以下結果 -
[datetime.time(12, 0) datetime.time(13, 0) datetime.time(14, 0)
datetime.time(15, 0) datetime.time(16, 0) datetime.time(17, 0)
datetime.time(18, 0) datetime.time(19, 0) datetime.time(20, 0)
datetime.time(21, 0) datetime.time(22, 0) datetime.time(23, 0)]
轉換爲時間戳
要轉換類似日期的對象(例如字符串,時代或混合)的序列或類似列表的對象,可以使用to_datetime
函數。當傳遞時將返回一個Series(具有相同的索引),而類似列表被轉換爲DatetimeIndex
。 看看下面的例子 -
import pandas as pd
time = pd.to_datetime(pd.Series(['Jul 31, 2009','2019-10-10', None]))
print(time)
執行上面示例代碼,得到以下結果 -
0 2009-07-31
1 2019-10-10
2 NaT
dtype: datetime64[ns]
NaT
表示不是一個時間的值(相當於NaN
)
舉一個例子,
import pandas as pd
import pandas as pd
time = pd.to_datetime(['2009/11/23', '2019.12.31', None])
print(time)
執行上面示例代碼,得到以下結果 -
DatetimeIndex(['2009-11-23', '2019-12-31', 'NaT'], dtype='datetime64[ns]', freq=None)