python - 连接同一数据框中的行
问题描述
我有一个数据框,我想进行一些更改。这是一个示例:
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
有任何想法吗?
非常感谢!
解决方案
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
编辑:
如果由 3 列使用,则可以使用删除set
s 的解决方案:DataFrame.drop_duplicates
更改了示例数据以便更好地解释:
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
推荐阅读
- python-3.x - matplotlib 在我的 x 轴上自动生成日期
- regex - 在 linux shell 中使用正则表达式从文本文件中提取字符串、grep IP 地址但使用 CIDR 排除子网
- php - 带有额外字段的 Laravel PIVOT 表
- python - 下载多个列表
- c - 我想用 printf 打印上标和下标,比如 x¹?
- c++ - 如何测量macos中线程的执行时间?
- mongodb - 如何 mongo-driver 文本搜索
- python - 尝试从 python-shell 获取数据,将其解析为 nodeJS 中的对象
- python - 在不使用数学的情况下获取多个输入并检查它们是否是完美的正方形
- java - 如何测试 docker 容器内的 Web 服务