@san_m_m

Как в pandas сделать список на основании данных нескольких столбцов?

Добрый день!

Есть DataFrame
import pandas as pd
df = pd.DataFrame({'movie': [9999999,  2,  3, 1, 9999999],
                  'rating': [3,  2,  9999999, 9999999, 3],
                  'name': [1,  2,  4, 5, 10]})


Нужно добавить еще один столбец, в котором будут данные по следующей логике...
Если в столбце movie 9999999, то берется значение из столбца rating, если в rating 9999999, то name
попробовал написать следующий код, но как мне кажется идея в корне не верна, поэтому я тут...
kol = []
for l in df:
    for i in l:
        if i['movie'] != 9999999:
            k = i['movie']
        elif i['rating'] != 9999999:
            k = i['rating']
        else:
            k = i['name']
        kol.append(k)
df['sum'] = kol
  • Вопрос задан
  • 126 просмотров
Решения вопроса 2
@o5a
Можно вынести вычисления в функцию и применить apply.
import pandas as pd
df = pd.DataFrame({'movie': [9999999,  2,  3, 1, 9999999],
                  'rating': [3,  2,  9999999, 9999999, 3],
                  'name': [1,  2,  4, 5, 10]})

def process(row):
    result = row['movie']
    if row['movie'] == 9999999:
        if row['rating'] == 9999999:
            result = row['name']
        else:
            result = row['rating']
    return result

df['sum'] = df.apply(process, axis=1)
Ответ написан
Комментировать
@kamenyuga
Не надо в пандасе использовать циклы - это медленно и некрасиво, т.к. пандас - векторный по своей сути. Потому что основан на нампае. Так что используй подходящий инструмент из нампая. Для фильтрации по значениям столбцов - это функция numpy.where, которую можно вкладывать в себя, как обычные условные операторы:

import numpy as np
import pandas as pd

if __name__ == '__main__':

    df = pd.DataFrame({
        'movie': [9999999,  2,  3, 1, 9999999],
        'rating': [9999999,  2,  9999999, 9999999, 3],
        'name': [1,  2,  4, 5, 10]})

    df['result'] = np.where(
        df['movie'] != 9999999,
        df['movie'],
        np.where(
            df['rating'] != 9999999,
            df['rating'],
            df['name']))

    print(df)

Результат:
movie   rating  name  result
0  9999999  9999999     1       1
1        2        2     2       2
2        3  9999999     4       3
3        1  9999999     5       1
4  9999999        3    10       3
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы