Pandas에서 특정 조건이 충족되는 행 값 업데이트


98

다음 데이터 프레임이 있다고 가정합니다.

표

컬럼의 값 업데이트 할 수있는 가장 효율적인 방법은 무엇입니까 위업another_feat 스트림 번호 (2)는 ?

이거예요?

for index, row in df.iterrows():
    if df1.loc[index,'stream'] == 2:
       # do something

업데이트 : 열이 100 개 이상이면 어떻게해야합니까? 업데이트 할 열의 이름을 명시 적으로 지정하고 싶지 않습니다. 각 열의 값을 2로 나누고 싶습니다 (스트림 열 제외).

그래서 내 목표가 무엇인지 명확히하기 위해 :

모든 값을 스트림 2가있는 모든 행의 2로 나누지 만 스트림 열은 변경하지 않음

답변:


204

loc두 열을 동일한 값으로 업데이트해야하는 경우 사용할 수 있다고 생각합니다 .

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

또 다른 일반적인 옵션은 numpy.where다음과 같습니다.

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

질문을 업데이트했는데 열이 100 개가 넘습니다. 어떻게해야합니까?
Stanko

1
@Stanko-다른 질문이라고 생각합니다 100. 이 열을 어떤 식 으로든 선택해야합니다 . 예를 들어 100첫 번째 열 이 필요한 경우 사용 df.columns[:100]하고 loc.
jezrael apr

처음 100 개의 열이 필요하지는 않습니다. 열의 모든 값 (스트림 열 제외)을 2로 나누고 싶습니다. 여기서 스트림은 fe 2
Stanko

그래서 loc과 np.where의 차이점은 loc은 조건 만 만족하는 행을 변경하지만 np.where에는 if 및 else 문이 있으므로 모든 행을 변경한다는 것입니다.
Ambleu

1
@Ambleu-정확히.
jezrael

3

다음과 .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)

이게 도움이 되길 바란다!


컬럼이 많지 않은 경우 가능하며 100 개 이상의 컬럼이 있다고 말해야합니다.
Stanko 2016

condition = (df.a == -1.001287)값이 행으로 나눌 것으로 예상하면서 마지막 편집을 테스트 a == -1.001287했지만 빈 데이터 프레임을 다시 얻었습니다.
Stanko

예, 이것은 실제 값이 아닌 디스플레이이기 때문에 다음과 같이 실제 값을 얻습니다 df.iloc[1,0].. 또는 더 나은 아직 자신을 값을 설정 한 다음 다시 시도하십시오 :df.iloc[1,0] = 1.2345; condition = df.a == 1.2345
타 노스

팔로우하지 condition = (df.a == -1.001287)않는데 왜 정확히 작동 하지 않나요?
Stanko 2011

8
ix이제 더 이상 사용되지 않습니다.
dbliss
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.