我有一个熊猫数据框,格式为:
user_id referral_code referred_by
1 A None
2 B A
3 C B
5 None None
6 E B
7 None none
....
我要做的是为每个用户ID创建另一列权重,以使其包含他对他人的引用总数以及被引用的次数,即我必须检查是否用户ID的Referral_code出现在referred_by列中,并对其频率计数,如果referred_by列中有针对该用户的条目,则还将其加1。
预期输出为:
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
,但没有提供预期的输出结果。
答案 0 :(得分:0)
您可以使用weights = df.referred_by.value_counts()['myword']+1
,然后将其添加到列权重中的df中!
答案 1 :(得分:0)
您要构建新的条件列。如果条件足够简单,则可以使用np.where
进行操作。我建议您看看这个post。
在这里,它非常复杂,应该使用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
希望有帮助!