인덱스를 사용하여 panda DataFrame의 특정 셀 값 설정
Panda Data Frame을 만들었습니다.
df = DataFrame(index=['A','B','C'], columns=['x','y'])
그리고 이걸 가지고 있다
x yNaN NaNB NaN NaNC NaN NaN
예를 행에 값을 하겠습니다.C
열 " " "x
다음과 같은 결과를 얻을 수 있을 것입니다.
x yNaN NaNB NaN NaNC 10 NaN
다음 코드 포함:
df.xs('C')['x'] = 10
,, 의의 df
변경되지 않았습니다. 은 아직 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★NaN
s.
좋은 의견이라도 있나?
RukTech의 답변은df.set_value('C', 'x', 10)
에서는, 이하에 나타내는 옵션보다 훨씬 고속입니다.그러나, 그것은 폐지될 예정이다.
앞으로 권장되는 방법은 입니다.
★★★★df.xs('C')['x']=10
다음 중 하나:
df.xs('C')
기본적으로는 데이터 복사본과 함께 새 데이터 프레임을 반환합니다.
df.xs('C')['x']=10
는 이 새로운 데이터 프레임만 변경합니다.
df['x']
returns 、 returns of of of of of of of의 합니다.df
프레임, 즉 " Frame", "Data Frame"
df['x']['C'] = 10
df
그 자체입니다.
경고:작업이 복사본 또는 보기를 반환할지 예측하는 것이 어려울 수 있습니다.따라서 문서에서는 "체인 인덱싱"을 사용하는 할당을 피하는 것이 좋습니다.
그래서 추천할 수 있는 대안은
df.at['C', 'x'] = 10
수정이 됩니다.df
.
In [18]: %timeit df.set_value('C', 'x', 10)
100000 loops, best of 3: 2.9 µs per loop
In [20]: %timeit df['x']['C'] = 10
100000 loops, best of 3: 6.31 µs per loop
In [81]: %timeit df.at['C', 'x'] = 10
100000 loops, best of 3: 9.2 µs per loop
★★★★★★★★★★★★★★★★★★★」.set_value
메서드는 폐지됩니다. .iat/.at
는 좋은 되지 않습니다. 불행히도 팬더들은 문서를 거의 제공하지 않습니다.
가장 빠른 방법은 set_value를 사용하는 것입니다.이 방법은 ~100배 고속입니다..ix
'다보다'와 같이요.
df.set_value('C', 'x', 10)
할 수도 ..loc
'이것'은 다음과 같습니다.
df.loc[df[<some_column_name>] == <condition>, [<another_column_name>]] = <value_to_add>
서 ''는<some_column_name
입니다.<condition>
및 변수입니다.<another_column_name>
추가할 컬럼(새 컬럼 또는 이미 존재하는 컬럼)입니다. <value_to_add>
는 해당 열/행에 추가할 값입니다.
이 예는 당면한 질문에서는 정확하게 작동하지 않지만, 조건에 따라 특정 값을 추가하고자 하는 사람에게 유용할 수 있습니다.
도 한번 써보세요.df.loc[row_index,col_indexer] = value
(유지관리자에 따르면) 값을 설정하는 권장 방법은 다음과 같습니다.
df.ix['x','C']=10
인덱스 사용체인 인덱스df['x']['C']
에 의해 가 발생할 수 에 의해 문제가 발생할 수 있습니다.
참조:
- https://stackoverflow.com/a/21287235/1579844
- http://pandas.pydata.org/pandas-docs/dev/indexing.html#indexing-view-versus-copy
- https://github.com/pydata/pandas/pull/6031
나한테 효과가 있었던 건 이것뿐이에요!
df.loc['C', 'x'] = 10
★★★의 .loc
여기 있습니다.
값을 설정하려면 다음을 사용합니다.
df.at[0, 'clm1'] = 0
- 변수를 설정하는 가장 빠른 권장 방법입니다.
set_value
,ix
더 이상 사용되지 않습니다.- , 경고는 없다.
iloc
★★★★★★★★★★★★★★★★★」loc
.iat/.at
은은해해 해다다다다다과 같은 data_frame이 하면, data_frame은 다음과 같습니다.
A B C
0 1 8 4
1 3 9 6
2 22 33 52
[0,"A"]
중 할 수 있습니다.
df.iat[0,0] = 2
df.at[0,'A'] = 2
여기 이 있습니다.iat
: cell :의하려면 , 다음의 순서를 합니다.
def prepossessing(df):
for index in range(0,len(df)):
df.iat[index,0] = df.iat[index,0] * 2
return df
y_train 이전:
0
0 54
1 15
2 15
3 8
4 31
5 63
6 11
한 후 을 prepossessing한다.iat
.
0
0 108
1 30
2 30
3 16
4 62
5 126
6 22
제안합니다.
df.loc[index_position, "column_name"] = some_value
이 예에서는 선택한 셀에서 변경만 하면 됩니다.
for index, row in result.iterrows():
if np.isnan(row['weight']):
result.at[index, 'weight'] = 0.0
'result'는 'weight' 열이 있는 데이터 필드입니다.
체인 인덱싱을 사용한 할당 회피
연쇄 인덱싱을 사용하는 할당을 처리하고 있으며, 이로 인해SettingWithCopy
경고합니다.이것은 반드시 피해야 한다.
은 한 해야 합니다..loc[]
★★★★★★★★★★★★★★★★★」.iloc[]
슬라이스(여기 설명)따라서 사용자의 경우:
df.loc['C', 'x'] = 10
다음은 모든 사용자가 정수 및 문자열로 인덱싱한 데이터 프레임에 대해 제공하는 유효한 솔루션의 요약입니다.
df.iloc
,df.loc
★★★★★★★★★★★★★★★★★」df.at
프레임 모두에 대해 합니다.df.iloc
열 정수 색인인 /열 정수 색인에만 할 수 있습니다.df.loc
★★★★★★★★★★★★★★★★★」df.at
는 열 이름 및/또는 정수 인덱스를 사용한 값 설정을 지원합니다.
하지 않는 두 인덱스가 모두 하지 않습니다.df.loc
★★★★★★★★★★★★★★★★★」df.at
행 을 기존 하지만, "/"/"/"/"/"/"/"/"/"/"/"/"/"/";df.iloc
올리다"IndexError: positional indexers are out-of-bounds"
Python 2.7 및 3.7 。
import numpy as np, pandas as pd
df1 = pd.DataFrame(index=np.arange(3), columns=['x','y','z'])
df1['x'] = ['A','B','C']
df1.at[2,'y'] = 400
# rows/columns specified does not exist, appends new rows/columns to existing data frame
df1.at['D','w'] = 9000
df1.loc['E','q'] = 499
# using df[<some_column_name>] == <condition> to retrieve target rows
df1.at[df1['x']=='B', 'y'] = 10000
df1.loc[df1['x']=='B', ['z','w']] = 10000
# using a list of index to setup values
df1.iloc[[1,2,4], 2] = 9999
df1.loc[[0,'D','E'],'w'] = 7500
df1.at[[0,2,"D"],'x'] = 10
df1.at[:, ['y', 'w']] = 8000
df1
>>> df1
x y z w q
0 10 8000 NaN 8000 NaN
1 B 8000 9999 8000 NaN
2 10 8000 9999 8000 NaN
D 10 8000 NaN 8000 NaN
E NaN 8000 9999 8000 499.0
하면 ..iloc
.
df.iloc[[2], [0]] = 10
set_value()
을 사용하다
발매 0.23.4부터 팬더 '미래를 알린다'
>>> df
Cars Prices (U$)
0 Audi TT 120.0
1 Lamborghini Aventador 245.0
2 Chevrolet Malibu 190.0
>>> df.set_value(2, 'Prices (U$)', 240.0)
__main__:1: FutureWarning: set_value is deprecated and will be removed in a future release.
Please use .at[] or .iat[] accessors instead
Cars Prices (U$)
0 Audi TT 120.0
1 Lamborghini Aventador 245.0
2 Chevrolet Malibu 240.0
이 조언을 참고하여 사용 방법에 대한 데모를 소개합니다.
- 행/열 정수 위치별
>>> df.iat[1, 1] = 260.0
>>> df
Cars Prices (U$)
0 Audi TT 120.0
1 Lamborghini Aventador 260.0
2 Chevrolet Malibu 240.0
- 행/열 레이블별
>>> df.at[2, "Cars"] = "Chevrolet Corvette"
>>> df
Cars Prices (U$)
0 Audi TT 120.0
1 Lamborghini Aventador 260.0
2 Chevrolet Corvette 240.0
참고 자료:
인덱스를 조건과 함께 사용하는 한 가지 방법은 먼저 조건을 충족하는 모든 행의 인덱스를 가져온 다음 여러 가지 방법으로 해당 행 인덱스를 사용하는 것입니다.
conditional_index = df.loc[ df['col name'] <condition> ].index
조건의 예는 다음과 같습니다.
==5, >10 , =="Any string", >= DateTime
그런 다음 다음과 같은 다양한 방법으로 행 인덱스를 사용할 수 있습니다.
- conditional_index에 대해 한 열의 값을 바꿉니다.
df.loc[conditional_index , [col name]]= <new value>
- conditional_index에 대한 여러 열의 값을 바꿉니다.
df.loc[conditional_index, [col1,col2]]= <new value>
- conditional_index를 저장함으로써 얻을 수 있는 이점 중 하나는 행 인덱스가 동일한 다른 열에 한 열의 값을 할당할 수 있다는 것입니다.
df.loc[conditional_index, [col1,col2]]= df.loc[conditional_index,'col name']
왜냐하면 .index 지수의 .loc 직접 주소 지정과 함께 다시 다시 traversals을 피하는 것이 사용할 수 있는 배열을 반환합니다 이 모든 것이 가능하다.
, 가 나오네요.df.set_value
만, 인 방법으로는 빠릅니다.df.at
처럼 가장 빠른 비 그것을 하기 위한 방법을 비난했다 것 같군요.
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(100, 100))
%timeit df.iat[50,50]=50 # ✓
%timeit df.at[50,50]=50 # ✔
%timeit df.set_value(50,50,50) # will deprecate
%timeit df.iloc[50,50]=50
%timeit df.loc[50,50]=50
7.06 µs ± 118 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
5.52 µs ± 64.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
3.68 µs ± 80.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
98.7 µs ± 1.07 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
109 µs ± 1.42 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
이것은 개인 휴대폰을 위해서 값을 설정합니다. 개 、 충 、 for 、loc
★★★★★★★★★★★★★★★★★」iloc
벡터화 된 것은, 「」입니다.
에 있는 셀을, 「0,0」의 문자열로 .'"236"76"'
하다:하다
df[0][0] = '"236"76"'
# %timeit df[0][0] = '"236"76"'
# 938 µs ± 83.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
아니면 팬더를 이용하고 있다.DataFrame.at
df.at[0, 0] = '"236"76"'
# %timeit df.at[0, 0] = '"236"76"'
#15 µs ± 2.09 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)
아니면 팬더를 이용하고 있다.DataFrame.iat
df.iat[0, 0] = '"236"76"'
# %timeit df.iat[0, 0] = '"236"76"'
# 41.1 µs ± 3.09 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
아니면 팬더를 이용하고 있다.DataFrame.loc
df.loc[0, 0] = '"236"76"'
# %timeit df.loc[0, 0] = '"236"76"'
# 5.21 ms ± 401 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
아니면 팬더를 이용하고 있다.DataFrame.iloc
df.iloc[0, 0] = '"236"76"'
# %timeit df.iloc[0, 0] = '"236"76"'
# 5.12 ms ± 300 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
만약 시간 관련이 팬더를 사용하고 있다.DataFrame.at는 가장 빠른 접근이다.
고수, 당신의 질문['x',C]에서 10을 중요시하는 것 Not-a-Number변환할입니다.
정답은..
df['x'].loc['C':]=10
df
대체 코드는
df.loc['C', 'x']=10
df
df.loc['c','x']=10
그러면 c번째 행과 x번째 열의 값이 변경됩니다.
전체 행이 아닌 일부 열에 대해서만 값을 변경하려면 다음 절차를 따릅니다.
x = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
x.iloc[1] = dict(A=10, B=-10)
0.에서는, 「」0.21 도 할 수 .1부터는.at
방법. 어떤 다른 점 와 비교하면 가지 몇차이가 있다에 비교된다..loc
여기서 언급했듯이 팬더.at와 .loc의 비교는 단일값 치환에 더 빠릅니다.
위의 답변과 더불어 기존 데이터 프레임에 데이터 행을 추가하는 다양한 방법을 비교하는 벤치마크를 소개합니다.이는 at 또는 set-value를 사용하는 것이 대규모 데이터 프레임(적어도 이러한 테스트 조건)에서 가장 효율적인 방법임을 보여줍니다.
- 각 행을 검색하고 새로운 dataframe 만들기...각 행에 대해 새 데이터 프레임을 만들고...
- ...추가(13.0초)
- ...연결(13.1초)
- 스토어 새로운 모든 행을 다른 컨테이너에서 처음, 새로운 dataframe에 한번 및 추가 변환하...모든 새 행을 다른 컨테이너에 먼저 저장하고 새 데이터 프레임으로 한 번 변환한 후 추가...
- 컨테이너 = 목록 목록 (2.0초)
- 컨테이너 = 목록 사전(1.9초)
- Preallocate 전체 dataframe, 새로운 행과 모든 열을 사용을 반복하다.
전체 데이터 프레임을 미리 할당하고 새 행과 모든 열에 반복한 후 다음을 사용하여 채우기
- ...(0.6초)로
- ... set_value (0.4초)
테스트에는 100,000 행과 1,000 열 및 랜덤 수치로 구성된 기존 데이터 프레임이 사용되었습니다.이 데이터 프레임에는 100개의 새로운 행이 추가되었습니다.
아래 코드 참조:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed Nov 21 16:38:46 2018
@author: gebbissimo
"""
import pandas as pd
import numpy as np
import time
NUM_ROWS = 100000
NUM_COLS = 1000
data = np.random.rand(NUM_ROWS,NUM_COLS)
df = pd.DataFrame(data)
NUM_ROWS_NEW = 100
data_tot = np.random.rand(NUM_ROWS + NUM_ROWS_NEW,NUM_COLS)
df_tot = pd.DataFrame(data_tot)
DATA_NEW = np.random.rand(1,NUM_COLS)
#%% FUNCTIONS
# create and append
def create_and_append(df):
for i in range(NUM_ROWS_NEW):
df_new = pd.DataFrame(DATA_NEW)
df = df.append(df_new)
return df
# create and concatenate
def create_and_concat(df):
for i in range(NUM_ROWS_NEW):
df_new = pd.DataFrame(DATA_NEW)
df = pd.concat((df, df_new))
return df
# store as dict and
def store_as_list(df):
lst = [[] for i in range(NUM_ROWS_NEW)]
for i in range(NUM_ROWS_NEW):
for j in range(NUM_COLS):
lst[i].append(DATA_NEW[0,j])
df_new = pd.DataFrame(lst)
df_tot = df.append(df_new)
return df_tot
# store as dict and
def store_as_dict(df):
dct = {}
for j in range(NUM_COLS):
dct[j] = []
for i in range(NUM_ROWS_NEW):
dct[j].append(DATA_NEW[0,j])
df_new = pd.DataFrame(dct)
df_tot = df.append(df_new)
return df_tot
# preallocate and fill using .at
def fill_using_at(df):
for i in range(NUM_ROWS_NEW):
for j in range(NUM_COLS):
#print("i,j={},{}".format(i,j))
df.at[NUM_ROWS+i,j] = DATA_NEW[0,j]
return df
# preallocate and fill using .at
def fill_using_set(df):
for i in range(NUM_ROWS_NEW):
for j in range(NUM_COLS):
#print("i,j={},{}".format(i,j))
df.set_value(NUM_ROWS+i,j,DATA_NEW[0,j])
return df
#%% TESTS
t0 = time.time()
create_and_append(df)
t1 = time.time()
print('Needed {} seconds'.format(t1-t0))
t0 = time.time()
create_and_concat(df)
t1 = time.time()
print('Needed {} seconds'.format(t1-t0))
t0 = time.time()
store_as_list(df)
t1 = time.time()
print('Needed {} seconds'.format(t1-t0))
t0 = time.time()
store_as_dict(df)
t1 = time.time()
print('Needed {} seconds'.format(t1-t0))
t0 = time.time()
fill_using_at(df_tot)
t1 = time.time()
print('Needed {} seconds'.format(t1-t0))
t0 = time.time()
fill_using_set(df_tot)
t1 = time.time()
print('Needed {} seconds'.format(t1-t0))
저도 이 토픽을 검색하다가 DataFrame을 통해 반복하여 두 번째 DataFrame에서 검색한 값으로 업데이트하는 방법을 만들었습니다.여기 제 코드가 있습니다.
src_df = pd.read_sql_query(src_sql,src_connection)
for index1, row1 in src_df.iterrows():
for index, row in vertical_df.iterrows():
src_df.set_value(index=index1,col=u'etl_load_key',value=etl_load_key)
if (row1[u'src_id'] == row['SRC_ID']) is True:
src_df.set_value(index=index1,col=u'vertical',value=row['VERTICAL'])
언급URL : https://stackoverflow.com/questions/13842088/set-value-for-particular-cell-in-pandas-dataframe-using-index
'programing' 카테고리의 다른 글
Mariadb / Mysql BUG ? : 서브쿼리에서 'master'별로 그룹화 (0) | 2022.09.18 |
---|---|
내 Python 어플리케이션에서 전송되는 전체 HTTP 요청을 보려면 어떻게 해야 합니까? (0) | 2022.09.18 |
MySql 표시 성능 (0) | 2022.09.18 |
가변 길이 어레이 사용에 대한 오버헤드가 있습니까? (0) | 2022.08.28 |
계산된 속성 'name'이(가) 할당되었지만 설정자가 없습니다(v-model 없음). (0) | 2022.08.28 |