Pandalarda belirli koşulların karşılandığı satır değerlerini güncelleme


96

Aşağıdaki veri çerçevesine sahip olduğumu varsayalım:

masa

Akışın 2 numara olduğu feat ve another_feat sütunlarının değerlerini güncellemenin en etkili yolu nedir ?

Bu mu?

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

GÜNCELLEME: 100'den fazla sütunum varsa ne yapmalıyım? Güncellemek istediğim sütunları açıkça adlandırmak istemiyorum. Her sütunun değerini 2'ye bölmek istiyorum (akış sütunu hariç).

Yani amacımın ne olduğunu açıklığa kavuşturmak için:

Tüm değerleri akış 2'ye sahip tüm satırlardan 2'ye bölmek, ancak akış sütununu değiştirmemek

Yanıtlar:


199

locİki sütunu aynı değere güncellemeniz gerekirse kullanabileceğinizi düşünüyorum :

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

Ayrı güncellemeye ihtiyacınız varsa, bir seçenek kullanın:

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

Diğer bir yaygın seçenek kullanımdır 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

DÜZENLEME: Tüm sütunları streamkoşul olmadan bölmeniz gerekiyorsa True, şunu kullanın:

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

Sorumu güncelledim, 100'den fazla sütunum var, bunu nasıl yapabilirim?
Stanko

1
@Stanko - Bence bu başka bir soru - bu 100sütunları bir şekilde seçmeniz gerekiyor . Örneğin 100ilk sütunlara ihtiyacınız varsa , kullanın df.columns[:100]ve sonra geçin loc.
jezrael

Mutlaka ilk 100 sütunu istemiyorum, sadece sütunların tüm değerlerini (akış sütunu hariç) 2'ye bölmek istiyorum, burada akış fe 2
Stanko

o halde loc ve np arasındaki fark, loc yalnızca koşulu sağlayan satırları değiştirir, ancak np. nerede if ve else ifadesine sahiptir, bu nedenle tüm satırları değiştirir?
Ambleu

1
@Ambleu - tam olarak.
jezrael

3

Aynısını .ixşunun gibi yapabilirsiniz:

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

DÜZENLE

Ekstra bilgiden sonra, aşağıdakiler tüm sütunları - bazı koşulların karşılandığı yerlerde - yarıya indirilmiş değerlerle döndürür:

>> condition = df.a > 0
>> df[condition][[i for i in df.columns.values if i not in ['a']]].apply(lambda x: x/2)

Umarım bu yardımcı olur!


Çok fazla sütunum yoksa bu yapılabilir, 100'den fazla sütunum olduğunu söylemeliyim.
Stanko

Son düzenlemenizi condition = (df.a == -1.001287), değerlerin satıra bölünmesini bekleyerek test a == -1.001287ettim, ancak boş bir veri çerçevesi aldım.
Stanko

Bu sadece ekran değil, gerçek değer olduğundan Evet, bu böyle gerçek değeri elde şöyledir: df.iloc[1,0]. Ya da daha iyisi değeri kendiniz belirleyin ve sonra tekrar deneyin:df.iloc[1,0] = 1.2345; condition = df.a == 1.2345
Thanos

Takip etmiyorum, neden tam olarak çalışmıyor condition = (df.a == -1.001287)?
Stanko

8
ixartık kullanımdan kaldırıldı.
dbliss
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.