我有一个看起来像这样的熊猫数据框:
+------+------------+
| A | B |
+------+------------+
| ID | 1 |
| Date | 2019-04-04 |
| Name | Carl |
| ID | 2 |
| Date | 2019-04-05 |
| Name | Jane |
+------+------------+
我正在尝试生成如下所示的输出:
+----+------------+------+
| ID | Date | Name |
+----+------------+------+
| 1 | 2019-04-04 | Carl |
| 2 | 2019-04-05 | Jane |
+----+------------+------+
我曾经尝试过转置,旋转和拆栈方法,但确实陷入困境。
答案 0 :(得分:4)
使用cumcount
创建密钥,然后使用pivot
df['C']=df.groupby('A').cumcount()
df.pivot(index='C',columns='A',values='B')
Out[118]:
A Date ID Name
C
0 2019-04-04 1 Carl
1 2019-04-05 2 Jane
答案 1 :(得分:2)
将check the source code与GroupBy.cumcount
和DataFrame.set_index
结合使用:
df = df.set_index([df.groupby('A').cumcount(), 'A'])['B'].unstack()
print (df)
A Date ID Name
0 2019-04-04 1 Carl
1 2019-04-05 2 Jane
如果列的顺序很重要,请添加:
df = (df.set_index([df.groupby('A').cumcount(), 'A'])['B']
.unstack()
.rename_axis(None, axis=1)
.reindex(['ID','Date','Name'], axis=1))
print (df)
ID Date Name
0 1 2019-04-04 Carl
1 2 2019-04-05 Jane
答案 2 :(得分:2)
我会使用字典来收集元素,然后使用DataFrame
构造函数。
d = {}
for a, b in zip(df.A, df.B):
d.setdefault(a, []).append(b)
pd.DataFrame(d)
ID Date Name
0 1 2019-04-04 Carl
1 2 2019-04-05 Jane
您还可以使用defaultdict
库中的collections
from collections import defaultdict
d = defaultdict(list)
for a, b in zip(df.A, df.B):
d[a].append(b)
pd.DataFrame(d)
ID Date Name
0 1 2019-04-04 Carl
1 2 2019-04-05 Jane