팬더 데이터 프레임의 전체 열에 값 설정
데이터 프레임의 전체 열을 특정 값으로 설정하려고 합니다.
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_all
object: 메모리에 새 개체가 생성되지 않습니다.
이러한 문제를 모두 방지하기 위해, 저는 종종 다음을 사용할 것을 상기시켜야만 합니다.copy
module - 메모리에서 개체를 복사하도록 명시적으로 강제하여 새 개체에 호출된 메서드가 소스 개체에 적용되지 않도록 합니다.저도 당신과 같은 문제가 있었고, 그것을 사용해서 피했습니다.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
'programing' 카테고리의 다른 글
팬더 DataFrame을 내보낼 때 열 이름 행을 어떻게 제거합니까? (0) | 2023.09.13 |
---|---|
C++ 및 C의 헤더 가드 (0) | 2023.09.13 |
하나의 명령으로 모든 행을 위로 이동할 수 있는 Mariaadb UPDATE 테이블? (0) | 2023.09.13 |
플렉스 컨테이너의 높이 행이 같음 (0) | 2023.09.13 |
Ubuntu에서 코어 덤프 파일을 생성하는 방법 (0) | 2023.09.13 |