python - 没有唯一列的 Pivot DataFrame
问题描述
我的 DataFrame 看起来像这样,
df =
index | A | B | C
0 |00456|text1|date1
1 |00443|text1|date2
2 |00456|text1|date3
3 |00231|text2|date4
4 |00231|text3|date1
5 |00456|text2|date1
我想结束以下内容,
df =
index | Α | B_1 |B_2 |B_3 |C_1...
0 |00456|text1|text1|text2|...
1 |00443|text1|NaN |NaN |...
2 |00231|text2|text3|NaN |...
拥有_1
后缀或NaN
值并不重要,我想要实现的是根据A列的内容将所有值放在同一行中。
实现这一目标的最佳方法是什么?
请注意,我使用我认为是一种过于复杂的方法来完成此操作,其中涉及看起来像这样的操作,
groups = df.groupby(["A"])
df = pd.concat((groups.A.apply(lambda x: pd.Series(data=x.values)).unstack(),
groups.B.apply(lambda x: pd.Series(data=x.values)).unstack(),
groups.C.apply(lambda x: pd.Series(data=x.values)).unstack()),
keys = ['A', 'B' 'C'], axis=1)
解决方案
用于GroupBy.cumcount
通过DataFrame.set_index
and重塑形状的计数器DataFrame.unstack
,最后MultiIndex
在列中展平并将索引转换为列:
g = df.groupby('A').cumcount() + 1
df1 = df.set_index(['A', g]).unstack()
df1.columns = [f'{a}_{b}' for a, b in df1.columns]
df1 = df1.reset_index()
print (df1)
A B_1 B_2 B_3 C_1 C_2 C_3
0 231 text2 text3 NaN date4 date1 NaN
1 443 text1 NaN NaN date2 NaN NaN
2 456 text1 text1 text2 date1 date3 date1
推荐阅读
- java - 无法创建请求的服务 [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] Java 错误
- python - 如何将项目映射到python中的池映射结果
- sas - 从 SAS 中的交叉分类嵌套组创建新组 ID 的最有效方法是什么?
- javascript - 如何为 javascript switch 语句的文本输出添加背景颜色?
- python - 如何在熊猫中正确添加图形
- r - 网站图中的 y 轴与 r 中的 ggplotly 重叠
- html - 如何对数字进行可视化表示
- java - MQ 响应只写 1 个请求 JAVA
- arrays - 错误:没有为类 '_MyHomePageState' 定义 getter 'datauser'
- spring-security - spring boot security中使用authenticationProvider时如何配置数据源?