【问题标题】:How can I merge rows using alternative columns as key?如何使用替代列作为键合并行?
【发布时间】:2020-05-17 10:29:58
【问题描述】:

我有一个由一些推文组成的数据集。每条推文都排成一排。我想将属于同一“对话”的推文合并在一起。我通过将tweet_ID 值与reply_to_ID 值匹配来确定哪些推文属于特定对话。基本上,当一条推文的reply_to_ID 与另一条推文的tweet_ID 匹配时,这意味着前一条推文是对后者的回复。下面是一个例子:

tweet_ID   reply_to_ID
1          None
2          1
3          1
4          3
5          None
6          4
7          5
8          None
9          5

结果应该是这样的

1      |None   |2      |1      |3      |1      |4      |3      |6      |4      |
5      |None   |7      |5      |9      |5      
8      |None

在此示例中,tweet_ID = 1 获得两个“直接”回复:tweet_ID = 2, 3 和两个“间接”回复:tweet_ID = 4, 6,它们是对 tweet_ID = 3tweet_ID = 4 的回复,但被视为对 tweet_ID = 1 的间接回复因为tweet_ID = 3 本身就是对tweet_ID =1 的回复,而tweet_ID = 6 是对tweet_ID =4 的回复,这是对tweet_ID =1 的间接回复。我们不知道这个兔子洞有多深。换句话说,我们不知道给定推文有多少间接回复。

tweet_ID = 5 有两个直接回复,没有间接回复,tweet_ID = 8 既没有直接回复也没有间接回复。

This link 有一个代码可以用来提取“直接”回复,但是在间接回复的情况下,我们应该怎么做,合并中的键在两列之间交替出现?

【问题讨论】:

  • 你试过什么?你可以发布你的代码吗?

标签: python dataframe


【解决方案1】:

这是我对你的问题的解决方案,你可以适应你的实际问题。

 tweets = [[1, None],
          [2, 1],
          [3, 1],
          [4, 3],
          [5, None],
          [6, 4],
          [7, 5],
          [8, None],
          [9, 5]]


def create_tweets_path(tweet_list: list):
    new_paths = []
    for idx, elem in enumerate(tweet_list):
        if elem[1] is None:
            result = create_new_path(tweet_list[idx:])
            new_paths.append(result)

    return new_paths


def create_new_path(tweet_list: list):
    new_list = [tweet_list[0][0]]
    new_real_list = [tweet_list[0]]
    for elem in tweet_list:
        if elem[1] in new_list:
            new_list.append(elem[0])
            new_real_list.append(elem)
    return new_real_list


paths = create_tweets_path(tweet_list=tweets)

for line in paths:
    print(line)

##Output##
[[1, None], [2, 1], [3, 1], [4, 3], [6, 4]]
[[5, None], [7, 5], [9, 5]]
[[8, None]]

【讨论】:

  • 更新为更有效的方式!
  • 又更新了,现在效率更高了!
  • 这不是真的。如果元素的顺序发生变化,则结果不再有效。考虑``` tweets = [[4, 3], [5, None], [6, 4], [1, None], [2, 1], [3, 1], [7, 5], [ 8, None], [9, 5]] ``` 基本上是一样的列表,但是结果不同。
  • 我认为列表是按推文 ID 排序的,按其他顺序没有意义。发布推文时,它会附加到列表中,对吗?因此,列表将按推文 ID 排序。无论如何,您可以在调用此函数之前对列表进行排序
  • Tweet_ID 是事实上的字符串。但是,您的解决方案仍然非常聪明。谢谢!
猜你喜欢
  • 2015-05-26
  • 2019-10-31
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多