我有一个如下数据框:
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
如何获得所需的数据框?
答案 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'] = ''
但是,这种转换的目的尚不清楚。也许您正在尝试解决错误的问题。