Python 在同一数据帧中联接行

Python 在同一数据帧中联接行,python,python-3.x,pandas,pandas-groupby,Python,Python 3.x,Pandas,Pandas Groupby,我有一个数据框,我想做一些更改。以下是一个示例: d = {'username': ['a', 'a', 'b', 'a', 'a'], 'state': ['AR', 'AZ', 'CA', 'CO', 'NY'], 'status': ['ADD', 'ADD', 'REMOVE', 'ADD', 'REMOVE']} df = pd.DataFrame(data=d) 我知道如何通过群交加入美国: df = df.fillna('').groupby(['userna

我有一个数据框,我想做一些更改。以下是一个示例:

d = {'username': ['a', 'a', 'b', 'a', 'a'],
     'state': ['AR', 'AZ', 'CA', 'CO', 'NY'],
     'status': ['ADD', 'ADD', 'REMOVE', 'ADD', 'REMOVE']}
df = pd.DataFrame(data=d)
我知道如何通过群交加入美国:

df = df.fillna('').groupby(['username', 'status'], as_index=False)['state'] \
    .apply(lambda x: ','.join(set(x))) \
    .reset_index() \
    .rename({0: 'state'}, axis=1)
但最终我得到了这样的东西,但仍然不是我所需要的:

username  status     state
a         ADD        AR,AZ,CO
a         REMOVE     NY
b         REMOVE     CA
我想制作这份最终报告:

有什么想法吗


多谢各位

您已接近,在
重置索引之前
使用:

或者通过以下方式将索引转换为列:

编辑:

如果由3列使用,则可以删除
set
s的解决方案:

更改了示例数据以获得更好的解释:

d = {'username': ['a', 'a', 'b', 'a', 'a', 'a'],
     'state': ['AR', 'AZ', 'CA', 'CO', 'NY', 'NY'],
     'status': ['ADD', 'ADD', 'REMOVE', 'ADD', 'REMOVE','REMOVE']}
df = pd.DataFrame(data=d)
print (df)
  username state  status
0        a    AR     ADD
1        a    AZ     ADD
2        b    CA  REMOVE
3        a    CO     ADD
4        a    NY  REMOVE
5        a    NY  REMOVE <- added row

我们可以在此处使用自定义
aggfunc

piv = df.pivot_table(index='username', columns='status', values='state', aggfunc=','.join)

status         ADD REMOVE
username                 
a         AR,AZ,CO     NY
b              NaN     CA

它太优雅了<代码>熊猫简而言之:)@ansev
df1 = (df.pivot_table(index='username', 
                     columns='status', 
                     values='state', 
                     aggfunc=lambda x: ','.join(set(x)), 
                     fill_value='')
         .reset_index()
         .rename_axis(None, axis=1))

print (df1)
  username       ADD REMOVE
0        a  AZ,AR,CO     NY
1        b               CA
d = {'username': ['a', 'a', 'b', 'a', 'a', 'a'],
     'state': ['AR', 'AZ', 'CA', 'CO', 'NY', 'NY'],
     'status': ['ADD', 'ADD', 'REMOVE', 'ADD', 'REMOVE','REMOVE']}
df = pd.DataFrame(data=d)
print (df)
  username state  status
0        a    AR     ADD
1        a    AZ     ADD
2        b    CA  REMOVE
3        a    CO     ADD
4        a    NY  REMOVE
5        a    NY  REMOVE <- added row
df1 = (df.pivot_table(index='username', 
                     columns='status', 
                     values='state', 
                     aggfunc=lambda x: ','.join(set(x)), 
                     fill_value='')
         .reset_index()
         .rename_axis(None, axis=1))

print (df1)
  username       ADD REMOVE
0        a  AZ,AR,CO     NY
1        b               CA
df1 = (df.drop_duplicates(['username','status','state'])
         .pivot_table(index='username', 
                     columns='status', 
                     values='state', 
                     aggfunc= ','.join, 
                     fill_value='')
         .reset_index()
         .rename_axis(None, axis=1))

print (df1)
  username       ADD REMOVE
0        a  AZ,AR,CO     NY
1        b               CA
piv = df.pivot_table(index='username', columns='status', values='state', aggfunc=','.join)

status         ADD REMOVE
username                 
a         AR,AZ,CO     NY
b              NaN     CA