programing

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

newstyles 2023. 6. 28. 21:24

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

예를 들어 다음과 같은 데이터 프레임이 있다고 가정합니다.

table

스트림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))

위의 두 코드 모두 다음을 수행합니다.

case1


mask()대체할 값이 상수(함수를 사용하여 파생되지 않음)인 경우 사용이 훨씬 더 간단합니다. 예를 들어 다음 코드가 모두 대체합니다.feat에 해당하는 값stream100으로 11 또는 3과 같습니다.

df[['stream']].join(df.filter(like='feat').mask(df['stream'].isin([1,3]), 100))

case2

1:feat방법을 사용하여 열을 선택할 수도 있습니다.

언급URL : https://stackoverflow.com/questions/36909977/update-row-values-where-certain-condition-is-met-in-pandas