【问题标题】:Add column with numbers based on count of value in other column in Pandas根据 Pandas 中其他列中的值计数添加带有数字的列
【发布时间】:2021-10-18 20:54:59
【问题描述】:

colA 是我目前拥有的。

但是,我正在尝试生成colB

我希望 colB 包含每个值的数字 001。但是,如果关联的 colA 值在该列中存在两次,我希望 colB 数字然后是 002,依此类推。

希望下面的示例可以根据colA 值更好地了解我正在寻找的内容。我一直在努力为此编写任何真正的代码。

编辑:努力用文字解释这一点,所以如果你能想到更好的解释方法,请随时更新我的​​问题。

colA   colB
BJ02   001
BJ02   002
CJ02   001
CJ03   001
CJ02   002
DJ01   001
DJ02   001
DJ07   001
DJ07   002
DJ07   003

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

使用groupby_cumcount:

df['colB'] = df.groupby('colA').cumcount().add(1)
print(df)

# Output
   colA  colB
0  BJ02     1
1  BJ02     2
2  CJ02     1
3  CJ03     1
4  CJ02     2
5  DJ01     1
6  DJ02     1
7  DJ07     1
8  DJ07     2
9  DJ07     3

@HenryEcker 建议,使用zfill

df['colB'] = df.groupby('colA').cumcount().add(1).astype(str).str.zfill(3)
print(df)

# Output:
   colA colB
0  BJ02  001
1  BJ02  002
2  CJ02  001
3  CJ03  001
4  CJ02  002
5  DJ01  001
6  DJ02  001
7  DJ07  001
8  DJ07  002
9  DJ07  003

【讨论】:

  • .astype(str).str.zfill(3) 可以添加以匹配上面的输出。喜欢@hilberts_drinking_problem 推荐
  • @HenryEcker。两条评论我都没看……其实答案就在cmets中。
  • 是的。那个会发生。 Ben.T 似乎不确定并选择发表评论并要求澄清。
  • 谢谢大家。这是我采用的解决方案。似乎工作正常。
【解决方案2】:

您可以使用 Counter() 计算 colA 中每个值出现的频率,然后创建一个函数来生成 colB 的值列表。

from collections import Counter    
def count_value(colA):
     new_col = []
     colA = df[colA].tolist()
     freq_table = Counter(colA) # count the frequency of each value
     for value in colA:
          new_col.append('00' + str(freq_table[value]))
     return new_col
df['colB'] = count_value(df['colA'])

【讨论】:

  • 谢谢。会试试这个。虽然看起来我已经使用 cmets 中其他两个人的建议让它工作了。
  • 随时欢迎您。我的方法更多的是围绕算法部分,但是 pandas 的内置函数总是很方便使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多