Вы хотите построить новый условный столбец . Если условия достаточно просты, вы можете сделать это с помощью 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
Надеюсь, что поможет!