팬더에서 특정 조건이 충족되는 행 값 업데이트
예를 들어 다음과 같은 데이터 프레임이 있다고 가정합니다.
스트림이 2번인 열 feat와 다른_feat의 값을 업데이트하는 가장 효율적인 방법은 무엇입니까?
이게 맞습니까?
for index, row in df.iterrows():
if df1.loc[index,'stream'] == 2:
# do something
열이 100개 이상일 경우 어떻게 해야 합니까?업데이트할 열의 이름을 명시적으로 지정하지 않습니다.각 열의 값을 2로 나누고 싶습니다(스트림 열 제외).
분명히 말씀드리자면, 제 목표는 다음과 같습니다.
스트림이 2인 모든 행 중 2로 모든 값을 나누지만 스트림 열은 변경하지 않습니다.
두 열을 동일한 값으로 업데이트해야 할 경우 사용할 수 있습니다.
df1.loc[df1['stream'] == 2, ['feat','another_feat']] = 'aaaa'
print df1
stream feat another_feat
a 1 some_value some_value
b 2 aaaa aaaa
c 2 aaaa aaaa
d 3 some_value some_value
별도의 업데이트가 필요한 경우 다음과 같은 옵션을 사용합니다.
df1.loc[df1['stream'] == 2, 'feat'] = 10
print df1
stream feat another_feat
a 1 some_value some_value
b 2 10 some_value
c 2 10 some_value
d 3 some_value some_value
다른 일반적인 옵션은 다음과 같습니다.
df1['feat'] = np.where(df1['stream'] == 2, 10,20)
print df1
stream feat another_feat
a 1 20 some_value
b 2 10 some_value
c 2 10 some_value
d 3 20 some_value
편집: 모든 열을 분할해야 하는 경우stream
조건이 있는 곳에True
사용:
print df1
stream feat another_feat
a 1 4 5
b 2 4 5
c 2 2 9
d 3 1 7
#filter columns all without stream
cols = [col for col in df1.columns if col != 'stream']
print cols
['feat', 'another_feat']
df1.loc[df1['stream'] == 2, cols ] = df1 / 2
print df1
stream feat another_feat
a 1 4.0 5.0
b 2 2.0 2.5
c 2 1.0 4.5
d 3 1.0 7.0
여러 조건으로 작업할 수 있는 경우 다중 또는:
df0 = pd.DataFrame({'Col':[5,0,-6]})
df0['New Col1'] = np.where((df0['Col'] > 0), 'Increasing',
np.where((df0['Col'] < 0), 'Decreasing', 'No Change'))
df0['New Col2'] = np.select([df0['Col'] > 0, df0['Col'] < 0],
['Increasing', 'Decreasing'],
default='No Change')
print (df0)
Col New Col1 New Col2
0 5 Increasing Increasing
1 0 No Change No Change
2 -6 Decreasing Decreasing
에서 동일한 작업을 수행할 수 있습니다..ix
다음과 같이:
In [1]: df = pd.DataFrame(np.random.randn(5,4), columns=list('abcd'))
In [2]: df
Out[2]:
a b c d
0 -0.323772 0.839542 0.173414 -1.341793
1 -1.001287 0.676910 0.465536 0.229544
2 0.963484 -0.905302 -0.435821 1.934512
3 0.266113 -0.034305 -0.110272 -0.720599
4 -0.522134 -0.913792 1.862832 0.314315
In [3]: df.ix[df.a>0, ['b','c']] = 0
In [4]: df
Out[4]:
a b c d
0 -0.323772 0.839542 0.173414 -1.341793
1 -1.001287 0.676910 0.465536 0.229544
2 0.963484 0.000000 0.000000 1.934512
3 0.266113 0.000000 0.000000 -0.720599
4 -0.522134 -0.913792 1.862832 0.314315
편집
추가 정보 후 다음은 일부 조건이 충족되는 모든 열을 절반 값으로 반환합니다.
>> condition = df.a > 0
>> df[condition][[i for i in df.columns.values if i not in ['a']]].apply(lambda x: x/2)
또 다른 벡터화된 솔루션은 이 방법을 사용하여 다음에 해당하는 행을 절반으로 줄이는 것입니다.stream=2
그리고.join()
이 열들은 오직 데이터 프레임으로 구성됩니다.stream
열:
cols = ['feat', 'another_feat']
df[['stream']].join(df[cols].mask(df['stream'] == 2, lambda x: x/2))
아니면 당신도 할 수 있습니다.update()
원본 데이터 프레임:
df.update(df[cols].mask(df['stream'] == 2, lambda x: x/2))
위의 두 코드 모두 다음을 수행합니다.
mask()
대체할 값이 상수(함수를 사용하여 파생되지 않음)인 경우 사용이 훨씬 더 간단합니다. 예를 들어 다음 코드가 모두 대체합니다.feat
에 해당하는 값stream
100으로 11 또는 3과 같습니다.
df[['stream']].join(df.filter(like='feat').mask(df['stream'].isin([1,3]), 100))
1:feat
방법을 사용하여 열을 선택할 수도 있습니다.
언급URL : https://stackoverflow.com/questions/36909977/update-row-values-where-certain-condition-is-met-in-pandas
'programing' 카테고리의 다른 글
Spring Boot 프로젝트에 메서드 기반 보안을 추가하려면 어떻게 해야 합니까? (0) | 2023.06.28 |
---|---|
Git는 서브모듈에 대한 커밋의 SHA1을 어디에 저장합니까? (0) | 2023.06.28 |
'Basic' 특성 유형은 지속성 엔티티가 아니어야 합니다. (0) | 2023.06.28 |
"Mongo 오류:객체에서 지리적 키를 추출할 수 없음"(유형: 점) (0) | 2023.06.28 |
내가 하는 일은 커밋을 지우는 것뿐인데 git-rebase에서 병합 충돌이 발생하는 이유는 무엇입니까? (0) | 2023.06.28 |