【问题标题】:Merging specific rows based on consecutive duplicate values in same column根据同一列中的连续重复值合并特定行
【发布时间】:2018-12-12 23:02:41
【问题描述】:

使用 R 或 python,我有一个数据集,我想知道如何将连续行与连续重复条目合并。

例子

X ....Y

猫...问


狗...U


猫...T


狗...P


猫*...是的


猫*...K


狗...P

X 列有一些条目,我想合并任何连续两次连续两次具有条目“cat”的行(我用“*”突出显示它们),这样它们将成为包含条目的一行在 Y 列中为 (Y , K)。

X.....Y

猫...问


狗...U


猫...T


狗...P


猫...Y,K


狗...T

如果是连续的,则几乎可以在一个条件下合并具有重复条目的任何行。

【问题讨论】:

  • 如果连续有3个你想做什么
  • 您打算改变多少次问题?对于已经提交答案的人来说并不好玩。
  • @d_kennetz 我也想做同样的事情。
  • @RichScriven 抱歉,我只是想澄清一下我要合并的是句子或单词而不是字符。
  • 你不应该改变你的问题。

标签: python r dplyr


【解决方案1】:

这是一个带有aggregatebase R 方法。通过比较'X'的相邻元素相等来创建一个分组列,使用aggregate中的分组依据和paste元素一起。

aggregate(Y ~ X + grp, transform(dat, 
    grp = cumsum(c(TRUE, X[-1] != X[-length(X)]))), 
           FUN = paste, collapse= ",")[c('X', 'Y')]
#    X   Y
#1 cat   Q
#2 dog   U
#3 cat   T
#4 dog   P
#5 cat Y,K
#6 dog   P

数据

dat <- structure(list(X = c("cat", "dog", "cat", "dog", "cat", "cat", 
 "dog"), Y = c("Q", "U", "T", "P", "Y", "K", "P")), 
  class = "data.frame", row.names = c(NA, -7L))

或使用python

dat['grp'] = (dat.X != dat.X.shift()).cumsum()
out = dat.groupby(['grp', 'X'])['Y'].apply(lambda x: \
           ",".join(x)).reset_index()[['X', 'Y']]
print(out)
#     X    Y
#0  cat    Q
#1  dog    U
#2  cat    T
#3  dog    P
#4  cat  Y,K
#5  dog    P

数据

import pandas as pd
import numpy as np
dat = pd.DataFrame({'X': ["cat", "dog", "cat", "dog", "cat", "cat", 
        "dog"], "Y": ["Q", "U", "T", "P", "Y", "K", "P"]})

【讨论】:

  • 数据部分?如果列表不是那么短怎么办?我的数据集是 7000 行
  • @MariamIbrahim 它应该适用于n 行数。
猜你喜欢
  • 2021-12-12
  • 2019-02-14
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
  • 2015-05-16
相关资源
最近更新 更多