Поиск столбца подсчета на основе 3 различных столбцов в пандах - PullRequest
0 голосов
/ 16 мая 2019

У меня есть фрейм данных панд в виде:

user_id referral_code referred_by
1        A              None
2        B              A
3        C              B
5        None           None
6        E              B
7        None           none

....

Что я хочу сделать, так это создать еще один вес столбца для каждого идентификатора пользователя, чтобы он содержал общее количество ссылок, которые он сделал на других, а также количество обращений к нему, т.е. я должен проверить, Referral_code идентификатора пользователя присутствует в столбце refer_by и считает его частоту, а также добавляет 1, если в столбце refer_by есть запись для пользователя.

Ожидаемый результат:

user_id referral_code referred_by weights
1        A              None       1
2        B              A          3
3        C              B          1
5        None           None       None
6        E              B          1
7        None           none       none

Подходы, которые пытались использовать, используют df.grouby вместе с size и count, но ничего не дает ожидаемого результата.

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Вы хотите построить новый условный столбец . Если условия достаточно просты, вы можете сделать это с помощью np.where. Я предлагаю вам взглянуть на этот пост .

Здесь все довольно сложно, есть решение с np.where, но оно не совсем очевидно. В этом случае вы можете использовать метод apply. Это дает вам возможность писать условия так сложно, как вы хотите. Использование apply менее эффективно, чем np.where, так как вам нужна абстракция python. Зависит от вашего набора данных и сложности ваших условий.

Вот пример с apply:

df = pd.DataFrame(
    [[1, "A" ,   None],
    [2 , "B" ,   "A"],
    [3 , "C" ,   "B"],
    [5 , None,   None],
    [6 , "E"  ,  "B"],
    [7 , None ,  None]],
    columns = 'user_id referral_code referred_by'.split(' ')
)
print(df)
#    user_id referral_code referred_by
# 0        1             A        None
# 1        2             B           A
# 2        3             C           B
# 3        5          None        None
# 4        6             E           B
# 5        7          None        None

weight_refered_by = df.referred_by.value_counts()
print(weight_refered_by)
# B    2
# A    1

def countWeight(row):
    count = 0

    if row['referral_code'] in weight_refered_by.index:
        count = weight_refered_by[row.referral_code]

    if row["referred_by"] != None:
        count += 1

    # If referral_code is none, result is none 
    # because referred_by is included in referral_code
    if row["referral_code"] == None:
        count = None
    return count

df["weights"] = df.apply(countWeight, axis=1)
print(df)
#    user_id referral_code referred_by  weights
# 0        1             A        None      1.0
# 1        2             B           A      3.0
# 2        3             C           B      1.0
# 3        5          None        None      NaN
# 4        6             E           B      1.0
# 5        7          None        None      NaN

Надеюсь, что поможет!

0 голосов
/ 16 мая 2019

Что вы можете сделать, это использовать weights = df.referred_by.value_counts()['myword']+1, а затем добавить его к вашему df в весах столбцов!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...