【问题标题】:Finding a count column based on 3 different column in pandas根据 pandas 中的 3 个不同列查找计数列
【发布时间】:2019-10-03 09:20:53
【问题描述】:

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

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 的 refer_code 存在于 refer_by 列中,并计算相同的频率,如果 refered_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 以及sizecount,但没有提供预期的输出。

【问题讨论】:

  • 为什么weights = 3 换成B ? (第 2 行)
  • @AlexandreB。因为对于用户 id 2,他由 A 推荐。然后他自己推荐其他人(在本例中为 3 和 6)。所以1+2。
  • 那么为什么第 1 行有 1 个?
  • 因为 1 没有被任何人推荐,但他已经推荐了另一个(在这种情况下为 B)。所以0+1。

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


【解决方案1】:

您可以做的是使用weights = df.referred_by.value_counts()['myword']+1,然后将其添加到您的 df 列权重中!

【讨论】:

  • 这里的['my word'] 是什么?
  • 您的信件如df.referred_by.value_counts()['A']df.referred_by.value_counts()['B']
【解决方案2】:

您想构建一个新的条件列。如果条件足够简单,你可以用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

希望有所帮助!

【讨论】:

  • 谢谢。做这项工作。虽然我尝试将数据框转换为列表并执行操作,但此解决方案效果更好。
猜你喜欢
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-14
  • 2021-07-20
  • 2016-04-11
相关资源
最近更新 更多