根据ID添加Pandas列值

时间:2018-06-27 10:20:36

标签: python python-3.x pandas dataframe

我对以下示例csv文件有以下要求,

colA   colB    NewCol
 1     val1     val1
 1     val2     val1 + val2
 1     val3     val1 + val2 + val3
 2     val4     val4
 2     val5     val4 + val5
 2     val6     val4 + val5 + val6
 3     val7     val7
 3     val8     val7 + val8
 3     val9     val7 + val8 + val9

我想向df添加一个新列,以便它仅为相同的ID值添加连续的colB值。 B列可以是整数或字符串。

2 个答案:

答案 0 :(得分:2)

使用<link href="{{ secure_asset('css/app.css') }}" rel="stylesheet"> <script src="{{ secure_asset('js/app.js') }}"></script> + langList.add('"' + obj.getCode() + '"');

groupby

要对字符串求和,可以对cumsum使用列表推导:

df['NewCol'] = df.groupby('colA')['colB'].cumsum()

说明

  • 首先通过groupby迭代df = df.sort_values('colA') df['C'] = [''.join(g.iloc[:i+1].values) \ for _, g in df.groupby('colA')['colB'] \ for i in range(len(g.index))] print(df) colA colB C 0 1 val1 val1 1 1 val2 val1val2 2 1 val3 val1val2val3 3 2 val4 val4 4 2 val5 val4val5 5 2 val6 val4val5val6 6 3 val7 val7 7 3 val8 val7val8 8 3 val9 val7val8val9 元素。由于我们仅对值感兴趣,因此此处忽略索引groupby
  • 然后迭代for _, g in df.groupby(...)[...],即遍历组中的项目数。
  • 在前_个值上应用range(len(g.index))。我们使用''.join提取组中的前i个值。
  • 将以上所有内容包装在嵌套列表中。

答案 1 :(得分:1)

使用np.cumsumpd.Series.cumsum最适合数字和字符串的方式:

df['NewCol'] = df.groupby('colA')['colB'].apply(np.cumsum)

或者:

df['NewCol'] = df.groupby('colA')['colB'].apply(pd.Series.cumsum)

print (df)
   colA  colB        NewCol
0     1  val1          val1
1     1  val2      val1val2
2     1  val3  val1val2val3
3     2  val4          val4
4     2  val5      val4val5
5     2  val6  val4val5val6
6     3  val7          val7
7     3  val8      val7val8
8     3  val9  val7val8val9