programing

인덱스를 사용하여 panda DataFrame의 특정 셀 값 설정

procenter 2022. 9. 18. 21:04
반응형

인덱스를 사용하여 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변경되지 않았습니다. 은 아직 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★NaNs.

좋은 의견이라도 있나?

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']에 의해 가 발생할 수 에 의해 문제가 발생할 수 있습니다.

참조:

나한테 효과가 있었던 건 이것뿐이에요!

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"] 중 할 수 있습니다.

  1. df.iat[0,0] = 2
  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

그런 다음 다음과 같은 다양한 방법으로 행 인덱스를 사용할 수 있습니다.

  1. conditional_index에 대해 한 열의 값을 바꿉니다.
df.loc[conditional_index , [col name]]= <new value>
  1. conditional_index에 대한 여러 열의 값을 바꿉니다.
df.loc[conditional_index, [col1,col2]]= <new value>
  1. 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

반응형