Python 复制groupby并用空字符串替换重复项

Python 复制groupby并用空字符串替换重复项,python,pandas,pandas-groupby,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

我有一个如下所示的数据帧:

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
我正在尝试将其转换为如下所示的数据帧,其中空单元格中填充了空字符串“”:

当我对所有列执行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
所做的一切就是找到正确的值,并用
''

替换其余的值。您可以在值与下面的值不相同的列上进行屏蔽,然后使用
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'] = ''

然而,这一转变的目的尚不清楚。可能您试图解决一个错误的问题。

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

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

然而,这一转变的目的尚不清楚。也许你试图解决一个错误的问题。

你能解释一下这个练习的目的吗?到目前为止,这听起来像是一种。在我的情况下,这是一种方便的格式,在应用程序的末尾,它涉及将数据帧转换为python“Table”对象,我正在终端环境中使用它来打印表。你能解释一下这个练习的目的吗?到目前为止,它听起来像是一种。在我的情况下,它是一种方便的格式,在应用程序的末尾,它涉及到将数据帧转换为python“Table”对象,我正在使用它在终端环境中打印表。