팬더 데이터 프레임을 NumPy 어레이로 변환
팬더 데이터 프레임을 NumPy 어레이로 변환하려면 어떻게 해야 합니까?
데이터 프레임:
import numpy as np
import pandas as pd
index = [1, 2, 3, 4, 5, 6, 7]
a = [np.nan, np.nan, np.nan, 0.1, 0.1, 0.1, 0.1]
b = [0.2, np.nan, 0.2, 0.2, 0.2, np.nan, np.nan]
c = [np.nan, 0.5, 0.5, np.nan, 0.5, 0.5, np.nan]
df = pd.DataFrame({'A': a, 'B': b, 'C': c}, index=index)
df = df.rename_axis('ID')
주다
label A B C
ID
1 NaN 0.2 NaN
2 NaN NaN 0.5
3 NaN 0.2 0.5
4 0.1 0.2 NaN
5 0.1 0.2 0.5
6 0.1 NaN 0.5
7 0.1 NaN NaN
다음과 같이 NumPy 배열로 변환합니다.
array([[ nan, 0.2, nan],
[ nan, nan, 0.5],
[ nan, 0.2, 0.5],
[ 0.1, 0.2, nan],
[ 0.1, 0.2, 0.5],
[ 0.1, nan, 0.5],
[ 0.1, nan, nan]])
그리고 dtype을 이렇게 보존할 수 있을까요?
array([[ 1, nan, 0.2, nan],
[ 2, nan, nan, 0.5],
[ 3, nan, 0.2, 0.5],
[ 4, 0.1, 0.2, nan],
[ 5, 0.1, 0.2, 0.5],
[ 6, 0.1, nan, 0.5],
[ 7, 0.1, nan, nan]],
dtype=[('ID', '<i4'), ('A', '<f8'), ('B', '<f8'), ('B', '<f8')])
df.to_numpy()
df.values
이유는 *이렇다.
한 번 강조해 볼 때입니다.values
★★★★★★★★★★★★★★★★★」as_matrix()
.
판다 v0.24.0에서는 판다 개체에서 NumPy 어레이를 얻는 두 가지 새로운 방법을 도입했습니다.
- 에 정의되어 있습니다
to_numpy()
.Index
,Series
, , , , 입니다.DataFrame
및 「」를 참조 - 에 정의되어 있습니다
array
.Index
★★★★★★★★★★★★★★★★★」Series
오브젝트만
용 v0.24 문서를 참조하면 다음과 같은 빨간색 경고가 표시됩니다.
사용법: 사용법을 권장합니다.
DataFrame.to_numpy()
★★★★★★ 。
상세한 것에 대하여는, v0.24.0 릴리스 노트의 이 항을 참조해 주세요.
* -to_numpy()
향후 많은 버전에서 안정적으로 실행해야 하는 프로덕션 코드에 대해 권장하는 방법입니다.에는 주피터나 단말기를 사용하여 스크래치 패드를 만듭니다..values
몇 밀리초의 입력 시간을 절약하는 것은 허용 가능한 예외입니다.핏 앤 피니시는 나중에 언제든지 추가할 수 있습니다.
일관성 향상:
에서 새로운 메서드 API가 되었습니다.to_numpy
는 데이터 프레임에서 기본 NumPy 어레이를 추출하기 위해 도입되었습니다.
# Setup
df = pd.DataFrame(data={'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]},
index=['a', 'b', 'c'])
# Convert the entire DataFrame
df.to_numpy()
# array([[1, 4, 7],
# [2, 5, 8],
# [3, 6, 9]])
# Convert specific columns
df[['A', 'C']].to_numpy()
# array([[1, 7],
# [2, 8],
# [3, 9]])
와 같이, 이 에음음음음음음음음음음음음음음음음음음음음음음 as as에 되어 있습니다.Index
★★★★★★★★★★★★★★★★★」Series
오브젝트(여기를 참조).
df.index.to_numpy()
# array(['a', 'b', 'c'], dtype=object)
df['A'].to_numpy()
# array([1, 2, 3])
기본적으로는 보기가 반환되므로 수정된 내용은 원본에 영향을 미칩니다.
v = df.to_numpy()
v[0, 0] = -1
df
A B C
a -1 4 7
b 2 5 8
c 3 6 9
에는 을 하십시오.to_numpy(copy=True)
.
팬더 > = 1.0 확장 업데이트종류들
팬더 1.x를 사용하고 있다면 확장 타입을 더 많이 다룰 수 있습니다.이러한 확장 타입이 올바르게 변환되도록 조금 더 주의를 기울여야 합니다.
a = pd.array([1, 2, None], dtype="Int64")
a
<IntegerArray>
[1, 2, <NA>]
Length: 3, dtype: Int64
# Wrong
a.to_numpy()
# array([1, 2, <NA>], dtype=object) # yuck, objects
# Correct
a.to_numpy(dtype='float', na_value=np.nan)
# array([ 1., 2., nan])
# Also correct
a.to_numpy(dtype='int', na_value=-1)
# array([ 1, 2, -1])
「」가한 경우」dtypes
그결...
다른 답변에서 알 수 있듯이, 이 방법을 사용하는 것이 좋습니다.
df.to_records()
# rec.array([('a', 1, 4, 7), ('b', 2, 5, 8), ('c', 3, 6, 9)],
# dtype=[('index', 'O'), ('A', '<i8'), ('B', '<i8'), ('C', '<i8')])
안 요.to_numpy
그 하다'를 사용할 .np.rec.fromrecords
:
v = df.reset_index()
np.rec.fromrecords(v, names=v.columns.tolist())
# rec.array([('a', 1, 4, 7), ('b', 2, 5, 8), ('c', 3, 6, 9)],
# dtype=[('index', '<U1'), ('A', '<i8'), ('B', '<i8'), ('C', '<i8')])
에서는 거의 비슷합니다).rec.fromrecords
을 참조)
df2 = pd.concat([df] * 10000)
%timeit df2.to_records()
%%timeit
v = df2.reset_index()
np.rec.fromrecords(v, names=v.columns.tolist())
12.9 ms ± 511 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
9.56 ms ± 291 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
새로운 메서드를 추가하는 이유
to_numpy()
에)array
)는 GitHub의 2가지 이슈 GH19954와 GH23623에서 논의한 결과 추가되었습니다.
구체적으로는, 다음의 이유에 대해 설명합니다.
와 [...]] ] ]
.values
반환된 값이 실제 배열인지, 일부 변형인지, 또는 팬더 맞춤 배열 중 하나인지 불분명합니다(예:Categorical
를 들어, 「」를 붙이면,PeriodIndex
,.values
「」를 합니다.ndarray
] [... objects of each each of of of of ]
to_numpy
API의 일관성을 향상시키는 것을 목표로 하고 있습니다.이는 올바른 방향으로 나아가는 중요한 단계입니다. .values
현재 버전에서는 권장되지 않지만, 향후 언젠가 이러한 일이 발생할 것으로 예상되므로 가능한 한 빨리 새로운 API로 이행해 주셨으면 합니다.
기타 솔루션에 대한 비판
DataFrame.values
이미 기술한 바와 같이, 에는 일관성이 없는 동작이 있습니다.
DataFrame.get_values()
는 v1.0에서 조용히 삭제되어 이전에 v0.25에서 폐지되었습니다.그 전에는 그냥 싸매고 다녔을 뿐이었어요.DataFrame.values
이치
DataFrame.as_matrix()
는 v1.0에서 삭제되어 이전에 v0.23에서 폐지되었습니다.사용하지 마십시오!
팬더 데이터 프레임(df)을 numpy ndarray로 변환하려면 다음 코드를 사용합니다.
df.values
array([[nan, 0.2, nan],
[nan, nan, 0.5],
[nan, 0.2, 0.5],
[0.1, 0.2, nan],
[0.1, 0.2, 0.5],
[0.1, nan, 0.5],
[0.1, nan, nan]])
메모 : ★.as_matrix()
이 답변에 사용된 방법은 사용되지 않습니다.0.4
★★
.as_matrix
이후 버전에서는 삭제될 예정입니다.값
팬더들은 뭔가 내장되어 있는...
numpy_matrix = df.as_matrix()
주다
array([[nan, 0.2, nan],
[nan, nan, 0.5],
[nan, 0.2, 0.5],
[0.1, 0.2, nan],
[0.1, 0.2, 0.5],
[0.1, nan, 0.5],
[0.1, nan, nan]])
DataFrame.reset_index() 및 DataFrame.values 함수를 체인으로 하면 인덱스를 포함한 데이터 프레임의 Numpy 표현을 얻을 수 있습니다.
In [8]: df
Out[8]:
A B C
0 -0.982726 0.150726 0.691625
1 0.617297 -0.471879 0.505547
2 0.417123 -1.356803 -1.013499
3 -0.166363 -0.957758 1.178659
4 -0.164103 0.074516 -0.674325
5 -0.340169 -0.293698 1.231791
6 -1.062825 0.556273 1.508058
7 0.959610 0.247539 0.091333
[8 rows x 3 columns]
In [9]: df.reset_index().values
Out[9]:
array([[ 0. , -0.98272574, 0.150726 , 0.69162512],
[ 1. , 0.61729734, -0.47187926, 0.50554728],
[ 2. , 0.4171228 , -1.35680324, -1.01349922],
[ 3. , -0.16636303, -0.95775849, 1.17865945],
[ 4. , -0.16410334, 0.0745164 , -0.67432474],
[ 5. , -0.34016865, -0.29369841, 1.23179064],
[ 6. , -1.06282542, 0.55627285, 1.50805754],
[ 7. , 0.95961001, 0.24753911, 0.09133339]])
dtype을 가져오려면 다음 뷰를 사용하여 이 ndarray를 구조화 배열로 변환해야 합니다.
In [10]: df.reset_index().values.ravel().view(dtype=[('index', int), ('A', float), ('B', float), ('C', float)])
Out[10]:
array([( 0, -0.98272574, 0.150726 , 0.69162512),
( 1, 0.61729734, -0.47187926, 0.50554728),
( 2, 0.4171228 , -1.35680324, -1.01349922),
( 3, -0.16636303, -0.95775849, 1.17865945),
( 4, -0.16410334, 0.0745164 , -0.67432474),
( 5, -0.34016865, -0.29369841, 1.23179064),
( 6, -1.06282542, 0.55627285, 1.50805754),
( 7, 0.95961001, 0.24753911, 0.09133339),
dtype=[('index', '<i8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])
.to_records
이 get godtype에서 .에서 DF를 DF'로입니다.object
"Dtype" (Dtype) :
In [102]: df
Out[102]:
label A B C
ID
1 NaN 0.2 NaN
2 NaN NaN 0.5
3 NaN 0.2 0.5
4 0.1 0.2 NaN
5 0.1 0.2 0.5
6 0.1 NaN 0.5
7 0.1 NaN NaN
In [103]: df.index.dtype
Out[103]: dtype('object')
In [104]: df.to_records()
Out[104]:
rec.array([(1, nan, 0.2, nan), (2, nan, nan, 0.5), (3, nan, 0.2, 0.5),
(4, 0.1, 0.2, nan), (5, 0.1, 0.2, 0.5), (6, 0.1, nan, 0.5),
(7, 0.1, nan, nan)],
dtype=[('index', '|O8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])
In [106]: df.to_records().dtype
Out[106]: dtype([('index', '|O8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])
recarray dtype을 변환하는 것은 나에게 효과가 없지만 Panda에서는 이미 이 작업을 수행할 수 있습니다.
In [109]: df.index = df.index.astype('i8')
In [111]: df.to_records().view([('ID', '<i8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])
Out[111]:
rec.array([(1, nan, 0.2, nan), (2, nan, nan, 0.5), (3, nan, 0.2, 0.5),
(4, 0.1, 0.2, nan), (5, 0.1, 0.2, 0.5), (6, 0.1, nan, 0.5),
(7, 0.1, nan, nan)],
dtype=[('ID', '<i8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])
하십시오.ID
내보낸 레코드 배열(버그?)에 포함되어 있기 때문에, 타입 변환으로부터도 이익을 얻을 수 있습니다.
정수만을 있다.i8
플로트, 플로트, 플로트f8
(이 문제를 참조).
것 같다df.to_records()
효과가 있을 겁니다.찾으시는 정확한 기능이 요청되었습니다.to_records
대안으로 지목했습니다.
당신의 예를 사용하여 로컬에서 이것을 시험해 보았습니다만, 그 콜은 당신이 찾고 있던 출력과 매우 유사한 결과를 얻을 수 있습니다.
rec.array([(1, nan, 0.2, nan), (2, nan, nan, 0.5), (3, nan, 0.2, 0.5),
(4, 0.1, 0.2, nan), (5, 0.1, 0.2, 0.5), (6, 0.1, nan, 0.5),
(7, 0.1, nan, nan)],
dtype=[(u'ID', '<i8'), (u'A', '<f8'), (u'B', '<f8'), (u'C', '<f8')])
은 「 」입니다.recarray
가 an an array
. 이를 일반 를 .numpy numpy 배열로 np.array(df.to_records())
.
이것을 시험해 보세요.
a = numpy.asarray(df)
팬더 Data Frame에서 구조체 배열을 만드는 방법을 소개합니다.
데이터 프레임 생성
import pandas as pd
import numpy as np
import six
NaN = float('nan')
ID = [1, 2, 3, 4, 5, 6, 7]
A = [NaN, NaN, NaN, 0.1, 0.1, 0.1, 0.1]
B = [0.2, NaN, 0.2, 0.2, 0.2, NaN, NaN]
C = [NaN, 0.5, 0.5, NaN, 0.5, 0.5, NaN]
columns = {'A':A, 'B':B, 'C':C}
df = pd.DataFrame(columns, index=ID)
df.index.name = 'ID'
print(df)
A B C
ID
1 NaN 0.2 NaN
2 NaN NaN 0.5
3 NaN 0.2 0.5
4 0.1 0.2 NaN
5 0.1 0.2 0.5
6 0.1 NaN 0.5
7 0.1 NaN NaN
팬더 DataFrame에서 numpy 구조 배열(레코드 배열이 아님)을 만드는 함수를 정의합니다.
def df_to_sarray(df):
"""
Convert a pandas DataFrame object to a numpy structured array.
This is functionally equivalent to but more efficient than
np.array(df.to_array())
:param df: the data frame to convert
:return: a numpy structured array representation of df
"""
v = df.values
cols = df.columns
if six.PY2: # python 2 needs .encode() but 3 does not
types = [(cols[i].encode(), df[k].dtype.type) for (i, k) in enumerate(cols)]
else:
types = [(cols[i], df[k].dtype.type) for (i, k) in enumerate(cols)]
dtype = np.dtype(types)
z = np.zeros(v.shape[0], dtype)
for (i, k) in enumerate(z.dtype.names):
z[k] = v[:, i]
return z
reset_index
인덱스를 데이터의 일부로 포함하는 새 데이터 프레임을 만듭니다.해당 데이터 프레임을 구조 배열로 변환합니다.
sa = df_to_sarray(df.reset_index())
sa
array([(1L, nan, 0.2, nan), (2L, nan, nan, 0.5), (3L, nan, 0.2, 0.5),
(4L, 0.1, 0.2, nan), (5L, 0.1, 0.2, 0.5), (6L, 0.1, nan, 0.5),
(7L, 0.1, nan, nan)],
dtype=[('ID', '<i8'), ('A', '<f8'), ('B', '<f8'), ('C', '<f8')])
편집: python 3에서 .encode()를 호출하는 오류를 피하기 위해 df_to_sarray를 업데이트했습니다.Joseph Garvin과 Halcyon의 의견과 해결책에 감사드립니다.
예를 들어 Data Frame:
df
gbm nnet reg
0 12.097439 12.047437 12.100953
1 12.109811 12.070209 12.095288
2 11.720734 11.622139 11.740523
3 11.824557 11.926414 11.926527
4 11.800868 11.727730 11.729737
5 12.490984 12.502440 12.530894
용도:
np.array(df.to_records().view(type=np.matrix))
취득:
array([[(0, 12.097439 , 12.047437, 12.10095324),
(1, 12.10981081, 12.070209, 12.09528824),
(2, 11.72073428, 11.622139, 11.74052253),
(3, 11.82455653, 11.926414, 11.92652727),
(4, 11.80086775, 11.72773 , 11.72973699),
(5, 12.49098389, 12.50244 , 12.53089367)]],
dtype=(numpy.record, [('index', '<i8'), ('gbm', '<f8'), ('nnet', '<f4'),
('reg', '<f8')]))
데이터 프레임을 Numpy 어레이 표현으로 변환하는 방법에는 두 가지가 있습니다.
mah_np_array = df.as_matrix(columns=None)
mah_np_array = df.values
문서: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.as_matrix.html
위의 답변을 검토했습니다.as_matrix() 메서드는 동작하지만 현재는 사용되지 않습니다.저는 ".to_numpy()"가 효과가 있었습니다.
다차원 배열을 반환합니다.엑셀 시트의 데이터를 읽고 있고 인덱스의 데이터에 액세스해야 하는 경우 이 방법을 사용하는 것이 좋습니다.이것이 도움이 되기를 바랍니다:)
데이터 프레임에서 arcgis 테이블로 내보낼 때 비슷한 문제가 발생하여 usgs(https://my.usgs.gov/confluence/display/cdi/pandas.DataFrame+to+ArcGIS+Table))에서 솔루션을 발견했습니다.즉, 다음과 같은 해결 방법이 있습니다.
df
A B C
ID
1 NaN 0.2 NaN
2 NaN NaN 0.5
3 NaN 0.2 0.5
4 0.1 0.2 NaN
5 0.1 0.2 0.5
6 0.1 NaN 0.5
7 0.1 NaN NaN
np_data = np.array(np.rec.fromrecords(df.values))
np_names = df.dtypes.index.tolist()
np_data.dtype.names = tuple([name.encode('UTF8') for name in np_names])
np_data
array([( nan, 0.2, nan), ( nan, nan, 0.5), ( nan, 0.2, 0.5),
( 0.1, 0.2, nan), ( 0.1, 0.2, 0.5), ( 0.1, nan, 0.5),
( 0.1, nan, nan)],
dtype=(numpy.record, [('A', '<f8'), ('B', '<f8'), ('C', '<f8')]))
데이터 프레임을 numpy 배열로 변환하는 간단한 방법:
import pandas as pd
df = pd.DataFrame({"A": [1, 2], "B": [3, 4]})
df_to_array = df.to_numpy()
array([[1, 3],
[2, 4]])
일관성을 유지하기 위해 to_numpy 사용을 권장합니다.
참고 자료: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_numpy.html
이것을 시험해 보세요.
np.array(df)
array([['ID', nan, nan, nan],
['1', nan, 0.2, nan],
['2', nan, nan, 0.5],
['3', nan, 0.2, 0.5],
['4', 0.1, 0.2, nan],
['5', 0.1, 0.2, 0.5],
['6', 0.1, nan, 0.5],
['7', 0.1, nan, nan]], dtype=object)
자세한 내용은 [https://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html]를 참조하십시오.번호 1.16.5 및 팬더 0.25.2에 적용됩니다.
운석의 대답에 더하여, 나는 암호를 찾았다.
df.index = df.index.astype('i8')
나한테는 안 통한다.그래서 나는 이 문제에 얽매인 다른 사람들의 편의를 위해 여기에 내 코드를 넣었다.
city_cluster_df = pd.read_csv(text_filepath, encoding='utf-8')
# the field 'city_en' is a string, when converted to Numpy array, it will be an object
city_cluster_arr = city_cluster_df[['city_en','lat','lon','cluster','cluster_filtered']].to_records()
descr=city_cluster_arr.dtype.descr
# change the field 'city_en' to string type (the index for 'city_en' here is 1 because before the field is the row index of dataframe)
descr[1]=(descr[1][0], "S20")
newArr=city_cluster_arr.astype(np.dtype(descr))
언급URL : https://stackoverflow.com/questions/13187778/convert-pandas-dataframe-to-numpy-array
'source' 카테고리의 다른 글
개체 배열에서 메서드 색인화하시겠습니까? (0) | 2022.09.29 |
---|---|
Java에서 숫자를 거듭제곱하다 (0) | 2022.09.29 |
MySQL 및 PHP - 빈 문자열 대신 NULL을 삽입합니다. (0) | 2022.09.29 |
Python을 사용한 디렉토리 반복 (0) | 2022.09.28 |
PHP는 클래스 이름에서 개체를 문자열로 인스턴스화할 수 있습니까? (0) | 2022.09.28 |