programing

팬더 데이터 프레임의 전체 열에 값 설정

i4 2023. 9. 13. 22:18
반응형

팬더 데이터 프레임의 전체 열에 값 설정

데이터 프레임의 전체 열을 특정 값으로 설정하려고 합니다.

In  [1]: df
Out [1]: 
     issueid   industry
0        001        xxx
1        002        xxx
2        003        xxx
3        004        xxx
4        005        xxx

제가 본 바로는loc데이터 프레임에서 값을 교체할 때 가장 적합한 방법은 다음과 같습니다(아니면 그렇지 않습니까?

In  [2]: df.loc[:,'industry'] = 'yyy'

하지만, 저는 여전히 이렇게 많이 회자되는 경고 메시지를 받았습니다.

A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead

하게되면

In  [3]: df['industry'] = 'yyy'

같은 경고 메시지를 받았습니다.

무슨 생각 있어요?Python 3.5.2 및 panda 0.18.1과 함께 작업합니다.


편집 2023년 1월:

이 질문에 대한 방문 횟수를 고려할 때, 제 원래 질문은 "전체 열에 값을 설정"하는 것이 아니라 데이터 프레임 복사 대 슬라이스에 대한 것이었다고 말할 필요가 있습니다.

  • copy-versus-slice:현재 제가 알기로는 일반적으로 슬라이싱 후에 데이터 프레임의 서브셋을 수정하려면 다음과 같이 서브셋을 생성해야 합니다..copy(). 슬라이스를 보기만 원하는 경우 아니요.copy()필요했다.
  • 값을 전체 열로 설정할 경우: 간단히 수행df[col_name] = col_value

다음 기능을 사용할 수 있습니다.

df = df.assign(industry='yyy')

파이썬은 기존 객체에서 새로운 객체를 정의할 때 예상치 못한 일을 할 수 있습니다.위의 코멘트에서 데이터 프레임이 다음과 같은 라인을 따라 정의된다고 명시했습니다.df = df_all.loc[df_all['issueid']==specific_id,:]. 이 경우에는.df정말로 그들이 저장된 행들을 위한 대역일 뿐입니다.df_allobject: 메모리에 새 개체가 생성되지 않습니다.

이러한 문제를 모두 방지하기 위해, 저는 종종 다음을 사용할 것을 상기시켜야만 합니다.copymodule - 메모리에서 개체를 복사하도록 명시적으로 강제하여 새 개체에 호출된 메서드가 소스 개체에 적용되지 않도록 합니다.저도 당신과 같은 문제가 있었고, 그것을 사용해서 피했습니다.deepcopy기능.

사용자의 경우 경고 메시지를 제거해야 합니다.

from copy import deepcopy
df = deepcopy(df_all.loc[df_all['issueid']==specific_id,:])
df['industry'] = 'yyy'

편집: 아래 데이비드 M의 훌륭한 코멘트도 보세요!

df = df_all.loc[df_all['issueid']==specific_id,:].copy()
df['industry'] = 'yyy'
df.loc[:,'industry'] = 'yyy'

이렇게 하면 마술이 됩니다.모든 행에 대해 ':'로 '.loc'을 추가해야 합니다.도움이 되길 바랍니다.

다음을 수행할 수 있습니다.

df['industry'] = 'yyy'

데이터 프레임이 '데이터'와 같다고 가정하면 데이터가 문자열인지 정수인지 고려해야 합니다.둘 다 다른 대우를 받습니다.그래서 이 경우에는 그것에 대해 구체적으로 말할 필요가 있습니다.

import pandas as pd

data = [('001','xxx'), ('002','xxx'), ('003','xxx'), ('004','xxx'), ('005','xxx')]

df = pd.DataFrame(data,columns=['issueid', 'industry'])

print("Old DataFrame")
print(df)

df.loc[:,'industry'] = str('yyy')

print("New DataFrame")
print(df)

이제 문자 대신 숫자를 넣으려면 작성하고 배열해야 합니다.

list_of_ones = [1,1,1,1,1]
df.loc[:,'industry'] = list_of_ones
print(df)

아니면 Numpy를 사용하는 경우.

import numpy as np
n = len(df)
df.loc[:,'industry'] = np.ones(n)
print(df)

그러면 행에 조건을 추가한 다음 해당 행에 해당하는 특정 열의 모든 셀을 변경할 수 있습니다.

df.loc[(df['issueid'] == '001'), 'industry'] = str('yyy')

제가 보기엔 다음과 같습니다.

df1 = df[df['col1']==some_value]새 DataFrame을 만들지 않습니다. 기본적으로 의 변경 사항입니다.df1게될다에 반영됩니다.df 경고로 이어집니다.
반면에에는.df1 = df[df['col1]]==some_value].copy() DataFrame을 생성할 것이고, 변경 사항은df1지다되지에 반영되지 않을 것입니다.df. 원본을 변경하지 않으려면 메소드를 사용하는 것이 좋습니다.df.

대신 사용할 수 있습니다.

df.iloc[:]['industry'] = 'yyy'

기억하세요: 이것은 데이터프레임에 존재하는 열에서만 작동합니다.

.loc을 사용하지 않은 사람들을 위한 것입니다.

이 답변을 위해 오는 다른 사람들과 복사를 사용하고 싶지 않은 사람들을 위해 -

df['industry'] = df['industry'].apply(lambda x: '')

도 이 방법에 가 있었습니다.df.loc[:,'industry'] = 'yyy'을 새로 고치고 잘 이 됩니다 , 했습니다 을 했습니다 을 .

세포를 재생시킨 후에 세포를 재생하는 것을 시도해 보는 것이 좋을 수도 있습니다.df.loc[:,'industry'] = 'yyy'.

새 데이터 프레임만 생성해도 전체 열에 값을 직접 서명할 수 없습니다.시스템은 데이터 프레임의 행 수를 알 수 없기 때문에 NaN으로 표시됩니다.크기를 정의하거나 일부 기존 열이 있어야 합니다.

df = pd.DataFrame()
df["A"] = 1
df["B"] = 2
df["C"] = 3

언급URL : https://stackoverflow.com/questions/44723183/set-value-on-an-entire-column-of-a-pandas-dataframe

반응형