对于列中的每个值仅复制第一行

问题描述

我有以下数据框:

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