pandas数据框:添加' count'一列上的多次出现的列/重复

时间:2018-03-05 17:45:18

标签: python-3.x pandas

我有一个pandas数据框,我希望通过添加' count'来简化复制(在一列,这里是第一列)。列(此处为最后一列,预设为" 1"对于我所在的行)。 我的数据框如下所示:

df = pandas.DataFrame([["a", ..., 1], # last row always 1 (this will be the 'count' column
                       ["a", ..., 1], #"a" = identical, other values not necessarily
                       ["b", ..., 1],
                       ["c", ..., 1],
                       ["a", ..., 1]
                       ["d", ..., 1],
                       ["d", ..., 1]])

请注意,我感兴趣的是第一个重复出现字母的专栏。其他列不一定是重复的,但可以在这里忽略。我想逐行浏览数据框并执行以下操作:

  • 在第一列中第一次出现实例时(例如在第一列中," a"第一次出现),检查该行的最后一列的值是否恰好为1 - 如果不是,则设置为1.
  • 在同一个实例的第二次出现时(例如在第二行,其中" a"再次出现):删除此行并将+1添加到此实例所在行的最后一列的值第一次发生。

我不确定执行此操作的最佳方式是在同一个数据框架中还是在新数据框架中,但最终会像这样结束df:

df2 = pandas.DataFrame([["a", ..., 3], # no changes except for last column counting three instances of "a": this line and two further lines
                                       # line deleted: "a" reoccurs
                       ["b", ..., 1],  # no changes
                       ["c", ..., 1],  # no changes
                                       # line deleted:  "a" reoccurs
                       ["d", ..., 2],  # no changes except last column counting two instances of "d": this line and one more
                                   ])  # line deleted:  "d" reoccurs

我真的不知道如何解决这个问题,我希望得到一些建议。 提前谢谢!

2 个答案:

答案 0 :(得分:1)

以下代码

import pandas as pd
df = pd.DataFrame({"first":["a", "b", "b", "a", "b", "c"], "second":range(6)})
result = df.groupby('first').first()
result['count'] = df['first'].value_counts()
result.reset_index(inplace=True)

创建数据框

  first  second
0     a       0
1     b       1
2     b       2
3     a       3
4     b       4
5     c       5

并将其变为

  first  second  count
0     a       0      2
1     b       1      3
2     c       5      1

这正是您所需要的。

<强>更新即可。在评论中,您询问了如何将不同的聚合应用于不同的列。这是一个例子

import pandas as pd
df = pd.DataFrame({"first":["a", "b", "b", "a", "b", "c"], 
                   "second":range(6), 'third': range(6)})
result = df.groupby('first').agg({'second': lambda x: x.iloc[0], 'third': max})
result['count'] = df['first'].value_counts()
result.reset_index(inplace=True)

产生

  first  second  third  count
0     a       0      3      2
1     b       1      4      3
2     c       5      5      1

以便secondthird列的汇总方式不同。

答案 1 :(得分:1)

大卫的数据

df.groupby('first').agg({'first':'count','second':'first'}).rename(columns={'first':'count'})
Out[1177]: 
       count  second
first               
a          2       0
b          3       1
c          1       5