首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何合并多列中具有重复值的行

如何合并多列中具有重复值的行
EN

Stack Overflow用户
提问于 2019-05-08 13:49:41
回答 2查看 60关注 0票数 3

我希望选择并合并与其他两列具有相同值的行(如SQL中的主键)。我应该使用什么函数?

我尝试过使用df.duplicate(subset=...),但似乎没有给出正确的结果。

例如,我想合并'col‘和'col’的值相同的行。

所以这个df就会变成

代码语言:javascript
复制
     col a   'col B'    col c   'col D'    col e
''''''''''''''''''''''''''''''''''''''''''''''''''''''
 0     a       ABC-1     nan      ABCD      b,c
 1     a       ABC-2     nan      ABCD      aaa
 2     b       ABC-1      c       ABCD      b,c
 3     c       ABC-1     a,b      ABCD     b,c,d
 4     nan     ABC-3      c       AACE      b,c

代码语言:javascript
复制
      col a   'col B'    col c   'col D'    col e
''''''''''''''''''''''''''''''''''''''''''''''''''''
 0     a,c     ABC-1    a,b,c     ABCD      b,c,d
 1      a      ABC-2     nan      ABCD      aaa
 2     nan     ABC-3      c       AACE      b,c

提前感谢

EN

回答 2

Stack Overflow用户

发布于 2019-05-08 14:00:10

如果顺序不重要拆分没有NaN的值,则在GroupBy.agg的自定义函数中转换为sets和join

代码语言:javascript
复制
def f(x):
    out = set([z for y in x.dropna() for z in y.split(',')])
    return ','.join(out) if bool(out) else np.nan

df = df.groupby(['col B','col D']).agg(f).reset_index().reindex(columns=df.columns)
print (df)
   col a  col B  col c col D  col e
0  c,a,b  ABC-1  a,c,b  ABCD  c,b,d
1      a  ABC-2    NaN  ABCD    aaa
2    NaN  ABC-3      c  AACE    c,b

如果顺序很重要,请使用OrderedDict

代码语言:javascript
复制
from collections import OrderedDict

def f(x):
    out = OrderedDict.fromkeys([z for y in x.dropna() for z in y.split(',')]).keys()
    return ','.join(out) if bool(out) else np.nan

df = df.groupby(['col B','col D']).agg(f).reset_index().reindex(columns=df.columns)
print (df)
   col a  col B  col c col D  col e
0  a,b,c  ABC-1  c,a,b  ABCD  b,c,d
1      a  ABC-2    NaN  ABCD    aaa
2    NaN  ABC-3      c  AACE    b,c
票数 1
EN

Stack Overflow用户

发布于 2019-05-08 15:03:33

你也可以看看下面的解决方案。

代码语言:javascript
复制
groups = df.groupby(['b','d'])

def reduce_values(dataframe):
    vals = []
#     print(dataframe.columns)
    for i in dataframe.columns:
        if dataframe[i].dropna().count():
            vals.append(','.join(set(dataframe[i].dropna().str.split(',').sum())))
        else:
            vals.append(dataframe[i][dataframe[i].index[-1]])
    return vals


# ndf

ndf = groups.apply(lambda x: pd.DataFrame([reduce_values(x)],columns=[i for i in x.columns if i not in groups.size().index.names])).reset_index(level=2,drop=True)

print(ndf)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56034300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档