Powiedzmy, że mam następującą ramkę danych:
Jaki jest najbardziej efektywny sposób aktualizowania wartości kolumn feat i another_feat, gdzie strumień ma numer 2 ?
Czy to jest to?
for index, row in df.iterrows():
if df1.loc[index,'stream'] == 2:
# do something
AKTUALIZACJA: Co zrobić, jeśli mam więcej niż 100 kolumn? Nie chcę jawnie nazywać kolumn, które chcę zaktualizować. Chcę podzielić wartość każdej kolumny przez 2 (z wyjątkiem kolumny strumienia).
Aby było jasne, jaki jest mój cel:
Dzielenie wszystkich wartości przez 2 ze wszystkich wierszy, które mają strumień 2, ale bez zmiany kolumny strumienia
100
jakoś wybrać te kolumny. np. jeśli potrzebujesz100
pierwszych kolumn, użyj,df.columns[:100]
a następnie przejdź doloc
.Możesz zrobić to samo za pomocą
.ix
, na przykład: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
EDYTOWAĆ
Po dodatkowych informacjach poniższe zwrócą wszystkie kolumny - w przypadku gdy spełniony jest jakiś warunek - z wartościami zmniejszonymi o połowę:
>> condition = df.a > 0 >> df[condition][[i for i in df.columns.values if i not in ['a']]].apply(lambda x: x/2)
Mam nadzieję, że to pomoże!
źródło
condition = (df.a == -1.001287)
spodziewając się, że wartości zostaną podzielone z wiersza, w któryma == -1.001287
otrzymałem pustą ramkę danych.df.iloc[1,0]
. Albo jeszcze lepiej ustaw wartość samodzielnie i spróbuj ponownie:df.iloc[1,0] = 1.2345; condition = df.a == 1.2345
condition = (df.a == -1.001287)
nie działa?ix
jest teraz przestarzała.