问题描述
我有以下数据框:
fake = pd.DataFrame({"group" : ["A","A","B","C","C"],"num" : ['1','2','3','4','5','6','7','8','9','10']})
>>> A num
0 A 1
1 A 2
2 A 3
3 B 4
4 B 5
5 B 6
6 B 7
7 B 8
8 C 9
9 C 10
我希望每个组仅复制第一行,以获得类似的内容:
>>> A num
0 A 1
1 A 2
2 A 3
**A 1**
3 B 4
4 B 5
5 B 6
6 B 7
7 B 8
**B 4**
8 C 9
9 C 10
**C 9**
当星星是我想要的新行时(仅复制第一行)
我该怎么做?我以为需要某种条件复制,但不知道该怎么做。
解决方法
一个想法是在DataFrame.append
中使用lambda函数:
df = fake.groupby('group').apply(lambda x: x.append(x.iloc[0])).reset_index(drop=True)
print (df)
group num
0 A 1
1 A 2
2 A 3
3 A 1
4 B 4
5 B 5
6 B 6
7 B 7
8 B 8
9 B 4
10 C 9
11 C 10
12 C 9
或者您可以在第一行中使用DataFrame.drop_duplicates
,在最后重复的位置更改索引,在DataFrame.append
之前添加到原始位置,最后将索引值的正确位置排序:
idx = fake.drop_duplicates('group',keep='last').index
df = (fake.append(fake.drop_duplicates('group')
.set_index(idx))
.sort_index(kind='mergesort')
.reset_index(drop=True))
print (df)
group num
0 A 1
1 A 2
2 A 3
3 A 1
4 B 4
5 B 5
6 B 6
7 B 7
8 B 8
9 B 4
10 C 9
11 C 10
12 C 9
,
在列group
上使用DataFrame.groupby
,并使用first
进行汇总,然后使用pd.concat
将其与原始数据帧连接起来,最后与sort_values
连接起来:
df = pd.concat([df,df.groupby('group',as_index=False).first()])\
.sort_values('group',ignore_index=True)
结果:
group num
0 A 1
1 A 2
2 A 3
3 A 1
4 B 4
5 B 5
6 B 6
7 B 7
8 B 8
9 B 4
10 C 9
11 C 10
12 C 9