31_Pandas.DataFrame,Series和NumPy陣列ndarray相互轉換
31_Pandas.DataFrame,Series和NumPy陣列ndarray相互轉換
pandas.DataFrame,pandas.Series與NumPy配列numpy.ndarray相互關聯変轉換できる。
- 獲取具有DataFrame系列的值屬性的ndarray
- 從NumPy陣列ndarray生成DataFrame
- 有關記憶體共享的注意事項(檢視和複製)
- Pandas0.24.0或更高版本:to_numpy()
每個示例都將用示例程式碼進行描述。
此外,pandas.DataFrame和pandas.Series也具有稱為as_matrix()的方法,該方法返回numpy.ndarray,但自0.23.0版本以來已棄用(不贊成使用)。
獲取帶有Pandas.DataFrame,Series屬性值的NumPy陣列ndarray
pandas.DataFrame和pandas.Series都可以獲取帶有值屬性的NumPy陣列numpy.ndarray。從pandas 0.24.0開始,建議使用末尾引入的to_numpy()方法。
對於pandas.DataFrame。
import numpy as np
import pandas as pd
df = pd.DataFrame(data=[[1, 2, 3], [4, 5, 6]], columns=['a', 'b', 'c'])
print(df)
# a b c
# 0 1 2 3
# 1 4 5 6
a_df = df.values
print(a_df)
# [[1 2 3]
# [4 5 6]]
print(type(a_df))
# <class 'numpy.ndarray'>
print(a_df.dtype)
# int64
對於pandas.Series。
s = df['a']
print(s)
# 0 1
# 1 4
# Name: a, dtype: int64
a_s = s.values
print(a_s)
# [1 4]
print(type(a_s))
# <class 'numpy.ndarray'>
print(a_s.dtype)
# int64
可以獲取的ndarray的資料型別dtype與原始pandas.DataFrame和pandas.Series的dtype相同。
df_f = pd.DataFrame([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]])
print(df_f)
# 0 1 2
# 0 0.1 0.2 0.3
# 1 0.4 0.5 0.6
a_df_f = df_f.values
print(a_df_f)
# [[0.1 0.2 0.3]
# [0.4 0.5 0.6]]
print(type(a_df_f))
# <class 'numpy.ndarray'>
print(a_df_f.dtype)
# float64
Pandas.DataFrame是數字和字串的組合,是物件型別ndarray。
df_multi = pd.read_csv('./data/31/sample_pandas_normal.csv')
print(df_multi)
# name age state point
# 0 Alice 24 NY 64
# 1 Bob 42 CA 92
# 2 Charlie 18 CA 70
# 3 Dave 68 TX 70
# 4 Ellen 24 CA 88
# 5 Frank 30 NY 57
a_df_multi = df_multi.values
print(a_df_multi)
# [['Alice' 24 'NY' 64]
# ['Bob' 42 'CA' 92]
# ['Charlie' 18 'CA' 70]
# ['Dave' 68 'TX' 70]
# ['Ellen' 24 'CA' 88]
# ['Frank' 30 'NY' 57]]
print(type(a_df_multi))
# <class 'numpy.ndarray'>
print(a_df_multi.dtype)
# object
如果僅要將DataFrame的特定列轉換為ndarray,則可以獲取提取該列的DataFrame的值。有關列提取,請參見以下文章。
如果僅選擇一列數字,則ndarray的型別將是該型別,而不是object。
a_df_int = df_multi[['age', 'point']].values
print(a_df_int)
# [[24 64]
# [42 92]
# [18 70]
# [68 70]
# [24 88]
# [30 57]]
print(type(a_df_int))
# <class 'numpy.ndarray'>
print(a_df_int.dtype)
# int64
在某些情況下,使用.T可能會更容易。
print(a_df_int.T)
# [[24 42 18 68 24 30]
# [64 92 70 70 88 57]]
還可以指定條件以僅提取特定型別的列。例如,如果只想提取int64型別的列,則可以編寫如下。
a_df_int = df_multi.select_dtypes(include=int).values
print(a_df_int)
# [[24 64]
# [42 92]
# [18 70]
# [68 70]
# [24 88]
# [30 57]]
print(type(a_df_int))
# <class 'numpy.ndarray'>
print(a_df_int.dtype)
# int64
有關使用select_dtypes()按資料型別dtype提取列的更多資訊,請參見以下文章。
- 29_pandas.DataFrame中提取(選擇)特定型別dtype的列
另外,也可以僅提取滿足條件的行名/列名的行/列。請參閱下面的文章。 - 30_Pandas.DataFrame提取(選擇)指定行名和列名的行和列
原始的pandas.DataFrame和轉換後的numpy.ndarray可能共享記憶體,而更改一個值可能會更改另一個值。見下文。
從NumPy陣列ndarray生成pandas.DataFrame,Series
可以在pandas.DataFrame和pandas.Series的建構函式的第一個引數資料中指定NumPy陣列numpy.ndarray。如稍後所述,numpy.ndarray和生成的pandas.DataFrame和pandas.Series共享記憶體。
生成pandas.Series
如果在建構函式中未指定其他任何引數,則它將是原始ndarray型別的Series。
import numpy as np
import pandas as pd
a = np.arange(4)
print(a)
# [0 1 2 3]
s = pd.Series(a)
print(s)
# 0 0
# 1 1
# 2 2
# 3 3
# dtype: int64
還可以指定索引名稱index,系列名稱,資料型別dtype等作為引數。
index = ['A', 'B', 'C', 'D']
name = 'sample'
s = pd.Series(data=a, index=index, name=name, dtype='float')
print(s)
# A 0.0
# B 1.0
# C 2.0
# D 3.0
# Name: sample, dtype: float64
在Series建構函式中為資料指定多維ndarray會導致錯誤。
a = np.arange(12).reshape((4, 3))
print(a)
# [[ 0 1 2]
# [ 3 4 5]
# [ 6 7 8]
# [ 9 10 11]]
# s = pd.Series(a)
# print(s)
# Exception: Data must be 1-dimensional
例如,可以選擇二維ndarray的行和列並將其轉換為pandas.Series。
s = pd.Series(a[2])
print(s)
# 0 6
# 1 7
# 2 8
# dtype: int64
s = pd.Series(a.T[2])
print(s)
# 0 2
# 1 5
# 2 8
# 3 11
# dtype: int64
生成pandas.DataFrame
與Series一樣,如果未在建構函式中指定其他任何引數,則它將是原始ndarray型別的DataFrame。
a = np.arange(12).reshape((4, 3))
print(a)
# [[ 0 1 2]
# [ 3 4 5]
# [ 6 7 8]
# [ 9 10 11]]
df = pd.DataFrame(a)
print(df)
# 0 1 2
# 0 0 1 2
# 1 3 4 5
# 2 6 7 8
# 3 9 10 11
還可以使用引數指定行名稱索引,列名稱列,資料型別dtype等。
index = ['A', 'B', 'C', 'D']
columns = ['a', 'b', 'c']
df = pd.DataFrame(data=a, index=index, columns=columns, dtype='float')
print(df)
# a b c
# A 0.0 1.0 2.0
# B 3.0 4.0 5.0
# C 6.0 7.0 8.0
# D 9.0 10.0 11.0
有關記憶體共享的注意事項(檢視和複製)
通過值屬性或建構函式相互轉換的Pandas.DataFrame或pandas.Series和numpy.ndarray可能彼此共享記憶體。如果共享記憶體(一個是另一個檢視),則更改一個值將更改另一個。如果要分別處理和使用它們,請務必小心。
下面的示例程式碼及其結果來自熊貓0.25.1。行為可能因版本而異。
values屬性
首先,在以下情況下。
df = pd.DataFrame(data=[[1, 2, 3], [4, 5, 6]], columns=['a', 'b', 'c'])
print(df)
# a b c
# 0 1 2 3
# 1 4 5 6
a_values = df.values
print(a_values)
# [[1 2 3]
# [4 5 6]]
值返回一個檢視,更改一個值將更改另一個值。可以通過np.shares_memory()確定。
print(np.shares_memory(a_values, df))
# True
a_values[0, 0] = 100
print(a_values)
# [[100 2 3]
# [ 4 5 6]]
print(df)
# a b c
# 0 100 2 3
# 1 4 5 6
它並不總是返回檢視,例如,如果每列具有不同的資料型別dtaepe,則返回副本。
df_if = pd.DataFrame(data=[[1, 0.1], [2, 0.2]], columns=['int', 'float'])
print(df_if)
# int float
# 0 1 0.1
# 1 2 0.2
print(df_if.dtypes)
# int int64
# float float64
# dtype: object
a_values_if = df_if.values
print(a_values_if)
# [[1. 0.1]
# [2. 0.2]]
print(np.shares_memory(a_values_if, df_if))
# False
a_values_if[0, 0] = 100
print(a_values_if)
# [[100. 0.1]
# [ 2. 0.2]]
print(df_if)
# int float
# 0 1 0.1
# 1 2 0.2
另外,在通過指定行和列等範圍獲取值時,檢視或副本可能會根據指定方法而有所不同。
print(df[['a', 'c']].values)
# [[100 3]
# [ 4 6]]
print(np.shares_memory(df[['a', 'c']].values, df))
# False
print(df.iloc[:, ::2].values)
# [[100 3]
# [ 4 6]]
print(np.shares_memory(df.iloc[:, ::2].values, df))
# True
如果檢視存在問題,則可以使用值的copy()顯式建立一個副本。
a_values_copy = df.values.copy()
print(a_values_copy)
# [[100 2 3]
# [ 4 5 6]]
print(np.shares_memory(a_values_copy, df))
# False
a_values_copy[0, 0] = 10
print(a_values_copy)
# [[10 2 3]
# [ 4 5 6]]
print(df)
# a b c
# 0 100 2 3
# 1 4 5 6
pandas.DataFrame,pandas.Series的構造方法
將numpy.ndarray傳遞給建構函式pandas.DataFrame()和pandas.Series()時,共享記憶體。更改一個值也會更改另一個值。
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)
# [[1 2 3]
# [4 5 6]]
df_a = pd.DataFrame(a, columns=['a', 'b', 'c'])
print(df_a)
# a b c
# 0 1 2 3
# 1 4 5 6
print(np.shares_memory(a, df_a))
# True
a[0, 0] = 100
print(a)
# [[100 2 3]
# [ 4 5 6]]
print(df_a)
# a b c
# 0 100 2 3
# 1 4 5 6
df_a.iat[1, 0] = 10
print(df_a)
# a b c
# 0 100 2 3
# 1 10 5 6
print(a)
# [[100 2 3]
# [ 10 5 6]]
如果不想共享記憶體,請使用numpy.ndarray的copy()將copy指定為建構函式的引數。
df_a_copy = pd.DataFrame(a.copy(), columns=['a', 'b', 'c'])
print(df_a_copy)
# a b c
# 0 100 2 3
# 1 10 5 6
a[0, 0] = 1
print(a)
# [[ 1 2 3]
# [10 5 6]]
print(df_a_copy)
# a b c
# 0 100 2 3
# 1 10 5 6
Pandas0.24.0或更高版本:to_numpy()
在pandas 0.24.0中,to_numpy()方法已新增到pandas.DataFrame和pandas.Series。返回numpy.ndarray,類似於上面的屬性值。
官方文件建議使用to_numpy()方法代替值屬性,但是從0.25.1版本開始,即使您使用值屬性也沒有警告。
df = pd.DataFrame(data=[[1, 2, 3], [4, 5, 6]], columns=['a', 'b', 'c'])
print(df)
# a b c
# 0 1 2 3
# 1 4 5 6
a = df.to_numpy()
print(a)
# [[1 2 3]
# [4 5 6]]
print(type(a))
# <class 'numpy.ndarray'>
預設情況下,它可能會返回一個檢視(共享記憶體的numpy.ndarray)以及值屬性。
print(np.shares_memory(df, a))
# True
a[0, 0] = 100
print(a)
# [[100 2 3]
# [ 4 5 6]]
print(df)
# a b c
# 0 100 2 3
# 1 4 5 6
如果copy引數為True,則返回一個副本。預設值為copy = False。
a_copy = df.to_numpy(copy=True)
print(a_copy)
# [[100 2 3]
# [ 4 5 6]]
print(np.shares_memory(df, a_copy))
# False
a_copy[0, 0] = 10
print(a_copy)
# [[10 2 3]
# [ 4 5 6]]
print(df)
# a b c
# 0 100 2 3
# 1 4 5 6
預設值(copy = False)也可能返回副本而不是檢視。 copy = True總是返回一個副本,但是copy = False並不總是返回一個檢視。
如果以上值屬性返回一個副本,則預設值(copy = False)也將是一個副本。
a_cols = df[['a', 'c']].to_numpy()
print(a_cols)
# [[100 3]
# [ 4 6]]
print(np.shares_memory(df, a_cols))
# False
可以使用引數dtype指定資料型別。如果資料型別已更改,它也會返回一個副本。
a_f = df.to_numpy(dtype=float)
print(a_f)
# [[100. 2. 3.]
# [ 4. 5. 6.]]
print(np.shares_memory(df, a_f))
# False
相關文章
- NumPy之:ndarray多維陣列操作陣列
- 陣列和集合的相互轉換陣列
- 字串和陣列的相互轉換字串陣列
- iOS字串和陣列的相互轉換iOS字串陣列
- javascript中字串和陣列的相互轉換JavaScript字串陣列
- Java實現普通二維陣列和稀疏陣列的相互轉換Java陣列
- js實現的字串和陣列的相互轉換JS字串陣列
- string與char陣列相互轉換陣列
- 陣列與字串方法與相互轉換陣列字串
- xml與陣列的相互轉換——phpXML陣列PHP
- js實現的陣列和CSV格式的相互轉換JS陣列
- Swift中實現Array陣列和NSArray陣列的相互轉換與遍歷Swift陣列
- JavaScript陣列與字串相互轉換 join、splitJavaScript陣列字串
- 轉:java中陣列與List相互轉換的方法Java陣列
- np.newaxis 為 numpy.ndarray(多維陣列)增加一個軸陣列
- Golang 陣列和字串之間的相互轉換[]byte/stringGolang陣列字串
- Java中 set,list,array(集合與陣列)、Map相互轉換Java陣列
- C# byte陣列與Image相互轉換的方法C#陣列
- 【Java】int[] 陣列 和 Integer陣列的轉換Java陣列
- c++中string類物件和字元陣列之間的相互轉換C++物件字元陣列
- javascript字串和陣列轉換JavaScript字串陣列
- List 和 陣列 的轉換陣列
- android byte[]陣列,bitmap,drawable之間的相互轉換Android陣列
- 轉 IOS---NSdata 與 NSString,Byte陣列,UIImage 的相互轉換iOS陣列UI
- numpy陣列(2)陣列
- Numpy陣列操作陣列
- numpy 陣列物件陣列物件
- RVA和RAW相互轉換
- 陣列與集合List的相互轉化陣列
- Python Numpy的陣列array和矩陣matrixPython陣列矩陣
- PHP陣列轉換為js陣列PHP陣列JS
- 旋轉矩陣與尤拉角的相互轉換矩陣
- 陣列和列表的轉換問題陣列
- NumPy之:ndarray中的函式函式
- numpy.ndarray的賦值操作賦值
- 使用Java完成byte陣列與十六進位制字串相互轉換Java陣列字串
- NumPy 陣列屬性陣列
- NumPy 超詳細教程(1):NumPy 陣列陣列