繁体   English   中英

熊猫groupby并将重复项替换为空字符串

[英]Pandas groupby and replace duplicates with empty string

我有一个如下数据框:

import pandas as pd

d = {'one':[1,1,1,1,2, 2, 2, 2],
     'two':['a','a','a','b', 'a','a','b','b'],
     'letter':[' a','b','c','a', 'a', 'b', 'a', 'b']}

df = pd.DataFrame(d)
>    one two letter
0    1   a      a
1    1   a      b
2    1   a      c
3    1   b      a
4    2   a      a
5    2   a      b
6    2   b      a
7    2   b      b

我正在尝试将其转换为如下所示的数据框,其中的空单元格用空字符串''填充:

one  two  letter
1    a    a        
          b        
          c         
     b    a         
2    a    a         
          b         
     b    a         
          b          

当我对所有列执行groupby时,我得到的序列对象基本上就是我要寻找的对象,而不是数据框:

df.groupby(df.columns.tolist()).size()   
1    a    a         1
          b         1
          c         1
     b    a         1
2    a    a         1
          b         1
     b    a         1
          b         1

如何获得所需的数据框?

您可以在值与下面的值不同的地方屏蔽列,然后where将其更改为空白字符串:

df[['one','two']] = df[['one','two']].where(df[['one', 'two']].apply(lambda x: x != x.shift()), '')

>>> df
  one two letter
0   1   a      a
1              b
2              c
3       b      a
4   2   a      a
5              b
6       b      a
7              b

一些解释

您的面具如下:

>>> df[['one', 'two']].apply(lambda x: x != x.shift())
     one    two
0   True   True
1  False  False
2  False  False
3  False   True
4   True   True
5  False  False
6  False   True
7  False  False

所有这一切where做的是找到值,其中这是真的,并与更换,其余''

原始问题的解决方案是在前两列中的每列中查找复制的单元格并将其设置为空:

df.loc[df.duplicated(subset=['one', 'two']), 'two'] = ''
df.loc[df.duplicated(subset=['one']),        'one'] = ''

但是,这种转换的目的尚不清楚。 也许您正在尝试解决错误的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM