【问题标题】:create new pandas column based on matching values from previous records根据以前记录的匹配值创建新的 pandas 列
【发布时间】:2020-07-07 16:18:34
【问题描述】:

我有一个带有列名称和 id 的 pandas 数据框,如下面的输入数据。我想创建一个新列“标签”,这样如果 id 比当前记录小一的记录具有相同的名称值,那么当前记录在标签列中的字母值将与前一个记录相同。如果它的名称有不同的值,那么我想递增到下一个字母值。我在下面提供了示例输出数据来说明我正在尝试做的事情。有谁知道用 pandas 或其他方式做到这一点的巧妙方法?

输入数据:

name id
cat   0
cat   1
dog   2
frog  3

输出数据:

label name id
A     cat   0
A     cat   1
B     dog   2
C     frog  3

【问题讨论】:

  • 你会超越 Z 吗?

标签: python-3.x pandas list for-loop


【解决方案1】:

这是一种方法:

from string import ascii_uppercase
from itertools import count



gen_letter = ((c * i for c in ascii_uppercase) for i in count(1))
r = []
for i, t in df.name.eq(df.name.shift()).items():
    if t:
        r.append(r[i - 1])
    else:
        r.append(next(gen_letter))

df['label'] = r

这个解决方案适用于许多标签,在您完成字母表后会变成:'AA'、'BB' ....

【讨论】:

  • 感谢您如此迅速地回复我。当我尝试运行它时,我得到一个“data_df2['label'] = r StopIteration:”错误,你知道是什么原因造成的吗?
  • @user3476463 我只是为你的例子展示,如果你的列中有很多名字,你现在可以检查我的代码
  • 当我运行你的新代码时,我得到所有标签值的“. at 0x7fb..”。有什么我想念的吗?我在 python 3.6
  • @user3476463 很奇怪,我有 pyton 3.7
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
  • 2020-04-16
  • 2022-10-13
相关资源
最近更新 更多