У меня есть фрейм данных Pandas, с которым я работаю, и мне просто нужно разделить все значения в определенном столбце, которые больше 800 на 100. Другими словами, если значение в столбце credit_score больше 800, оно Можно предположить, что данные были введены с двумя дополнительными знаками слева от десятичного знака. Например...

id    credit_score    column_b    column_c
0     750             ...         ...
1     653             ...         ...
2     741             ...         ...
3     65100           ...         ...
4     73500           ...         ...
5     565             ...         ...
6     480             ...         ...
7     78900           ...         ...
8     699             ...         ...
9     71500           ...         ...

Поэтому я хочу разделить кредитные баллы для индексов строк 3, 4, 7 и 9 на 100, но не для остальных. Я хочу, чтобы новые, действительные значения заменили старые, недействительные. Кроме того, новый столбец, такой как credit_score_fixed, тоже будет работать. Я довольно новичок в Python и Pandas, поэтому любая помощь очень ценится.

5
ScottP 8 Янв 2017 в 18:38

3 ответа

Лучший ответ

Вы можете использовать mask :

df.credit_score = df.credit_score.mask( df.credit_score > 800, df.credit_score/ 100)

Или numpy.where :

df.credit_score = np.where( df.credit_score > 800, df.credit_score/ 100, df.credit_score)

print (df)
   id  credit_score    col   col1
0   0           750  750.0  750.0
1   1           653  653.0  653.0
2   2           741  741.0  741.0
3   3         65100  651.0  651.0
4   4         73500  735.0  735.0
5   5           565  565.0  565.0
6   6           480  480.0  480.0
7   7         78900  789.0  789.0
8   8           699  699.0  699.0
9   9         71500  715.0  715.0
4
jezrael 8 Янв 2017 в 15:51

Я бы использовал логическое индексирование панд:

In [193]: df.loc[df.credit_score > 800, 'credit_score'] /= 100

In [194]: df
Out[194]:
    credit_score
id
0          750.0
1          653.0
2          741.0
3          651.0
4          735.0
5          565.0
6          480.0
7          789.0
8          699.0
9          715.0
4
MaxU 8 Янв 2017 в 15:43

Вы можете использовать Series.apply, Он принимает функцию и применяет ее к каждому элементу серии. Обратите внимание, что он не на месте, и вам нужно будет переназначить серию, которую он возвращает, либо в новый столбец, либо в тот же столбец.

def fix_scores(score):
    return score / 100 if score > 800 else score
    # same as
    # if score > 800:
    #      return score / 100
    # return score

df['credit_score_fixed'] = df['credit_score'].apply(fix_scores)
2
DeepSpace 8 Янв 2017 в 15:40