根据熊猫中的3个不同的列查找计数列

时间:2019-05-16 07:12:01

标签: python python-3.x pandas dataframe pandas-groupby

我有一个熊猫数据框,格式为:

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.groubysizecount,但没有提供预期的输出结果。

2 个答案:

答案 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

希望有帮助!