【发布时间】:2017-05-11 23:57:46
【问题描述】:
我有以下数据框:
topic student level week
1 a 1 1
1 b 2 1
1 a 3 1
2 a 1 2
2 b 2 2
2 a 3 2
2 b 4 2
3 c 1 2
3 b 2 2
3 c 3 2
3 a 4 2
3 b 5 2
它包含一个列级别,用于指定谁发起了该主题以及谁回复了该主题。如果学生的等级为1,则表示他提出了这个问题。如果学生的等级为2,则表示他回答了提出问题的学生。如果学生的等级为3,则表示他回复了等级为2及以上的学生。
我想提取一个新的数据框,该数据框应该通过每周主题呈现学生之间的交流。它应该包含五列:“学生来源”、“学生目的地”、“周”、“总主题”和“回复数”。
我应该得到类似的东西:
st_source st_dest week total_topics reply_count
a b 1 1 1
a b 2 2 1
a c 2 1 0
b a 1 1 0
b a 2 2 0
b c 2 1 0
c a 2 1 0
c b 2 1 1
学生目标是每个学生与之分享主题的学生。
总主题是与其他学生共享的一些主题。我使用以下代码找到了它:
idx_cols = ['topic', 'week']
std_cols = ['student_x', 'student_y']
d1 = df.merge(df, on=idx_cols)
d2 = d1.loc[d1.student_x != d1.student_y, idx_cols + std_cols]
d2.loc[:, std_cols] = np.sort(d2.loc[:, std_cols])
d3 = d2.drop_duplicates().groupby(
std_cols + ['week']).size().reset_index(name='count')
d3.columns = ['st_source', 'st_dest', 'week', 'total_topics']
我很难找到最后一列“回复数”。
回复计数是学生目的地“直接”回复学生来源的次数。如果一个话题是由学生 A 发起的(通过在级别 1 发送消息),B 回复 A(在级别 2 发送消息),因此 B 直接回复 A。考虑“直接”从 B 回复 A 当且仅当 B 在同一主题的第 k-1 级回复所有级别 k 到 A 的消息。只有 2 级到 1 级的学生回复。
有人有什么建议吗?
如果我应该更好地解释它,请告诉我。
谢谢!
【问题讨论】:
-
目标回复源?如果 a 在第 1 周发布了第 1 条消息,而 b 在第 2 周发布了第 2 条消息怎么办?
-
对,目的地回复源!如果 a 在第 1 周发布第 1 条消息,而 b 在第 2 周发布第 2 条消息,您就不算数......只要它在同一周内......正如你在这里看到的那样,我每周都有分析 @Trolldejo
-
知道了,答案正在路上;)
-
@Trolldejo 感谢您的努力!对此,我真的非常感激! :)