基于ID添加列值

2024-03-29 13:43:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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可以是整数或字符串。你知道吗


Tags: 文件csvdfval1val2colbcolaval3
2条回答

使用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

解释

  • 首先通过for _, g in df.groupby(...)[...]迭代groupby元素。这里我们忽略索引_,因为我们只对值感兴趣。你知道吗
  • 然后迭代range(len(g.index)),即迭代组中的项目数。你知道吗
  • 对第一个i值应用''.join。我们使用g.iloc[:i+1]来提取组中的第一个i值。你知道吗
  • 在嵌套列表中包装以上所有内容。你知道吗

使用^{}pd.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

相关问题 更多 >