판다의 다른 값을 기준으로 한 값 변경
저는 제 스타타 코드를 파이썬으로 복제하려고 하는데, 판다의 방향을 가리켰습니다.하지만 데이터를 어떻게 처리해야 할지 고민입니다.
열 머리글 'ID'의 모든 값을 반복하려고 합니다.해당 ID가 특정 번호와 일치하면 FirstName과 LastName 두 개의 해당 값을 변경하고자 합니다.
Stata에서는 다음과 같이 표시됩니다.
replace FirstName = "Matt" if ID==103
replace LastName = "Jones" if ID==103
따라서 ID == 103에 해당하는 FirstName의 모든 값을 Matt로 바꿉니다.
판다에서 저는 이런 것을 시도하고 있습니다.
df = read_csv("test.csv")
for i in df['ID']:
if i ==103:
...
여기서 어디로 가야 할지 모르겠어요.아이디어 있어요?
한 가지 옵션은 Python의 슬라이싱 및 인덱싱 기능을 사용하여 조건이 유지되는 위치를 논리적으로 평가하고 데이터를 덮어쓰는 것입니다.
데이터를 직접 로드할 수 있다고 가정합니다.pandas
와 함께pandas.read_csv
그렇다면 다음 코드가 당신에게 도움이 될 것입니다.
import pandas
df = pandas.read_csv("test.csv")
df.loc[df.ID == 103, 'FirstName'] = "Matt"
df.loc[df.ID == 103, 'LastName'] = "Jones"
설명에 언급된 것처럼 두 열의 할당을 한 번에 수행할 수도 있습니다.
df.loc[df.ID == 103, ['FirstName', 'LastName']] = 'Matt', 'Jones'
덮어쓰기 할당 작업에 사용하려면 0.11 이상 버전이 필요합니다.실제로 0.8과 같은 이전 버전의 경우(연결된 할당에 대한 비판자들이 말할 수 있음에도 불구하고), 연결된 할당이 이를 수행하는 올바른 방법입니다. 따라서 더 현대적인 버전의 판다에서 피해야 하는지 여부를 아는 것이 유용한 이유입니다.
또 다른 방법은 연결된 할당이라고 하는 것을 사용하는 것입니다.이 동작은 덜 안정적이므로 최상의 솔루션으로 간주되지 않습니다(문서에서는 명시적으로 권장하지 않음). 그러나 다음 사항에 대해 알아두는 것이 유용합니다.
import pandas
df = pandas.read_csv("test.csv")
df['FirstName'][df.ID == 103] = "Matt"
df['LastName'][df.ID == 103] = "Jones"
사용할 수 있습니다.map
그것은 딕토니어리나 심지어 사용자 정의 함수의 값을 매핑할 수 있습니다.
이것이 당신의 df라고 가정합니다.
ID First_Name Last_Name
0 103 a b
1 104 c d
딕트를 만듭니다.
fnames = {103: "Matt", 104: "Mr"}
lnames = {103: "Jones", 104: "X"}
지도:
df['First_Name'] = df['ID'].map(fnames)
df['Last_Name'] = df['ID'].map(lnames)
결과는 다음과 같습니다.
ID First_Name Last_Name
0 103 Matt Jones
1 104 Mr X
또는 사용자 정의 함수를 사용합니다.
names = {103: ("Matt", "Jones"), 104: ("Mr", "X")}
df['First_Name'] = df['ID'].map(lambda x: names[x][0])
원래 질문은 특정한 좁은 사용 사례를 다루고 있습니다.다음은 보다 일반적인 답변이 필요한 사용자를 위한 몇 가지 예입니다.
다른 열의 데이터를 사용하여 새 열 생성
아래의 데이터 프레임을 고려할 때:
import pandas as pd
import numpy as np
df = pd.DataFrame([['dog', 'hound', 5],
['cat', 'ragdoll', 1]],
columns=['animal', 'type', 'age'])
In[1]:
Out[1]:
animal type age
----------------------
0 dog hound 5
1 cat ragdoll 1
아래에 새 항목을 추가합니다.description
열을 다른 열의 연결로 사용합니다.+
시리즈에 대해 재정의되는 작업입니다.화려한 문자열 포맷, f-string 등은 여기서 작동하지 않을 것입니다.+
스칼라에 적용되며 '스칼라' 값에는 적용되지 않습니다.
df['description'] = 'A ' + df.age.astype(str) + ' years old ' \
+ df.type + ' ' + df.animal
In [2]: df
Out[2]:
animal type age description
-------------------------------------------------
0 dog hound 5 A 5 years old hound dog
1 cat ragdoll 1 A 1 years old ragdoll cat
는 리는우를 받습니다.1 years
1 year
우리가 아래 조건을 사용하여 수정할 것입니다.
조건을 사용하여 기존 열 수정
여기서 원본을 교체합니다.animal
다른 열의 값이 포함된 열, 다음 값을 기반으로 조건부 부분 문자열을 설정하는 데 사용age
:
# append 's' to 'age' if it's greater than 1
df.animal = df.animal + ", " + df.type + ", " + \
df.age.astype(str) + " year" + np.where(df.age > 1, 's', '')
In [3]: df
Out[3]:
animal type age
-------------------------------------
0 dog, hound, 5 years hound 5
1 cat, ragdoll, 1 year ragdoll 1
조건을 사용하여 여러 열 수정
보다 유연한 접근 방식은 단일 열이 아닌 전체 데이터 프레임을 호출하는 것입니다.
def transform_row(r):
r.animal = 'wild ' + r.type
r.type = r.animal + ' creature'
r.age = "{} year{}".format(r.age, r.age > 1 and 's' or '')
return r
df.apply(transform_row, axis=1)
In[4]:
Out[4]:
animal type age
----------------------------------------
0 wild hound dog creature 5 years
1 wild ragdoll cat creature 1 year
에서 위의 에서.transform_row(r)
함수는 주어진 행을 나타내는 객체를 취합니다.axis=1
기본값axis=0
는 를제할것다니입을 합니다.Series
각 열에 대한 개체).이렇게 하면 열 이름을 사용하여 행의 실제 '원시' 값에 액세스할 수 있고 지정된 행/열의 다른 셀을 볼 수 있으므로 처리가 간소화됩니다.
이 질문은 케이시스 씨의 답변에 부록을 제공할 가치가 있을 정도로 여전히 자주 방문될 수 있습니다. 그dict
기본 제공 클래스를 하위 클래스로 분류하여 '기본값' 키를 반환할 수 있습니다.이 메커니즘은 판다들에게 잘 작동합니다.하지만 아래를 보세요.
이러한 방식으로 주요 오류를 방지할 수 있습니다.
>>> import pandas as pd
>>> data = { 'ID': [ 101, 201, 301, 401 ] }
>>> df = pd.DataFrame(data)
>>> class SurnameMap(dict):
... def __missing__(self, key):
... return ''
...
>>> surnamemap = SurnameMap()
>>> surnamemap[101] = 'Mohanty'
>>> surnamemap[301] = 'Drake'
>>> df['Surname'] = df['ID'].apply(lambda x: surnamemap[x])
>>> df
ID Surname
0 101 Mohanty
1 201
2 301 Drake
3 401
다음과 같은 방법으로 동일한 작업을 더 간단하게 수행할 수 있습니다. 'default' 수용에 'get
dict dict.dict를 할 .
>>> import pandas as pd
>>> data = { 'ID': [ 101, 201, 301, 401 ] }
>>> df = pd.DataFrame(data)
>>> surnamemap = {}
>>> surnamemap[101] = 'Mohanty'
>>> surnamemap[301] = 'Drake'
>>> df['Surname'] = df['ID'].apply(lambda x: surnamemap.get(x, ''))
>>> df
ID Surname
0 101 Mohanty
1 201
2 301 Drake
3 401
df['FirstName']=df['ID'].apply(lambda x: 'Matt' if x==103 else '')
df['LastName']=df['ID'].apply(lambda x: 'Jones' if x==103 else '')
이 각 의 값을 있는 , 이를 합니다..apply()
기능이 있는 것이 가는 길입니다.
df = pd.DataFrame({'col_a':[0,0], 'col_b':[1,2]})
col_a col_b
0 0 1
1 0 2
def func(row):
if row.col_a == 0 and row.col_b <= 1:
row.col_a = -1
row.col_b = -1
return row
df.apply(func, axis=1)
col_a col_b
0 -1 -1 # Modified row
1 0 2
비록 ~일지라도.apply()
일반적으로 데이터 프레임에 새 행/열을 추가하는 데 사용되며, 기존 행/열의 값을 수정하는 데 사용할 수 있습니다.
각 행이 조건을 충족하는 위치를 인쇄하여 데뷔하는 것이 훨씬 쉽다는 것을 알게 되었습니다.
for n in df.columns:
if(np.where(df[n] == 103)):
print(n)
print(df[df[n] == 103].index)
언급URL : https://stackoverflow.com/questions/19226488/change-one-value-based-on-another-value-in-pandas
'programing' 카테고리의 다른 글
C#을 사용하여 메서드를 매개 변수로 전달 (0) | 2023.06.11 |
---|---|
Angular 2 NgForm에서 터치된 이벤트를 관찰하는 방법은 무엇입니까? (0) | 2023.06.11 |
미들웨어에서 Vuex로 상태가 업데이트되지 않습니까? (0) | 2023.06.11 |
도구 모음에 뒤로 화살표 표시 (0) | 2023.06.06 |
개체 속성별로 Ruby의 개체 배열을 정렬하시겠습니까? (0) | 2023.06.06 |