[python] Pandas에서 특정 조건이 충족되는 행 값 업데이트
다음 데이터 프레임이 있다고 가정합니다.
컬럼의 값 업데이트 할 수있는 가장 효율적인 방법은 무엇입니까 위업 과 another_feat 스트림 번호 (2)는 ?
이거예요?
for index, row in df.iterrows():
if df1.loc[index,'stream'] == 2:
# do something
업데이트 :
열이 100 개 이상이면 어떻게해야합니까? 업데이트 할 열의 이름을 명시 적으로 지정하고 싶지 않습니다. 각 열의 값을 2로 나누고 싶습니다 (스트림 열 제외).
그래서 내 목표가 무엇인지 명확히하기 위해 :
모든 값을 스트림 2가있는 모든 행의 2로 나누지 만 스트림 열은 변경하지 않음
답변
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
답변
다음과 .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)
이게 도움이 되길 바란다!