我有一个数据框,我想进行一些更改。这是一个示例:
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
我要生成此最终报告:
username ADD REMOVE
a AR,AZ,CO NY
b CA
有什么想法吗?
非常感谢您!
答案 0 :(得分:3)
您很亲密,在reset_index
使用Series.unstack
之前:
df1 = (df.fillna('')
.groupby(['username', 'status'])['state'] \
.apply(lambda x: ','.join(set(x)))
.unstack(fill_value='')
.reset_index()
.rename_axis(None, axis=1))
print (df1)
username ADD REMOVE
0 a AZ,AR,CO NY
1 b CA
或使用DataFrame.pivot_table
并通过reset_index
将索引转换为列,并通过DataFrame.rename_axis
删除列名称:
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
编辑:
如果按三列使用DataFrame.drop_duplicates
,则可以通过删除set
来解决问题:
更改了样本数据以得到更好的解释:
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
答案 1 :(得分:3)
我们可以在此处将pivot_table
与自定义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