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

时间:2018-08-02 05:18:15

标签: python pandas pandas-groupby

我有一个如下数据框:

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

如何获得所需的数据框?

2 个答案:

答案 0 :(得分: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所做的所有事情就是找到正确的值,并将其余的替换为''

答案 1 :(得分:0)

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

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

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