比较熊猫系列中连续行的字符串值

Posted

技术标签:

【中文标题】比较熊猫系列中连续行的字符串值【英文标题】:Comparing string values from sequential rows in pandas series 【发布时间】:2021-08-11 10:01:53 【问题描述】:

我正在尝试使用用户定义的函数计算熊猫系列的连续行中的常见字符串值,并将输出写入新列。我想出了各个步骤,但是当我把它们放在一起时,我得到了错误的结果。你能告诉我最好的方法吗?我是一个非常初学者的 Pythonista!

我的熊猫 df 是:

df = pd.DataFrame("Code": ['d7e', '8e0d', 'ft1', '176', 'trk', 'tr71'])

我的字符串比较循环是:

x='d7e'
y='8e0d'
s=0
for i in y:
   b=str(i)
      if b not in x:
          s+=0
      else:
          s+=1
print(s)

这些特定字符串的正确结果是 2

注意,当我执行 def func(x,y): s 计数器时发生了一些事情,它不会产生正确的结果。我想我需要在每次循环运行时将其重置为 0。

然后,我使用 df.shift 来指定 y 和 x 在一系列中的位置:

x = df["Code"]
y = df["Code"].shift(periods=-1, axis=0)

最后,我使用 df.apply() 方法来运行函数:

df["R1SB"] = df.apply(func, axis=0)

我在新列“R1SB”中得到 None 值

我的正确输出是:

    "Code"   "R1SB"
0    d7e      None
1    8e0d     2
2    ft1      0
3    176      1
4    trk      0
5    tr71     2

感谢您的帮助!

【问题讨论】:

【参考方案1】:

试一试:

df['R1SB'] = df.assign(temp=df.Code.shift(1)).apply(
    lambda x: np.NAN
    if pd.isna(x['temp'])
    else sum(i in str(x['temp']) for i in str(x['Code'])),
    1,
)

输出:

   Code  R1SB
0   d7e   NaN
1  8e0d   2.0
2   ft1   0.0
3   176   1.0
4   trk   0.0
5  tr71   2.0

【讨论】:

很漂亮,非常感谢!我消化了你的代码,我想我理解了大部分内容: 第 1 行:你通过为 y line2 创建一个临时系列之类的东西来分配一个新变量:使用 np.NAN 来掩盖第 3 行正在检查的新列的第一个值缺失值(如第 2 行中的 NaN) 第 4 行:计算 temp 和“代码”列之间的常见实例数我唯一没有得到的是第 5 行中的 1。它有什么用? 这里的第 5 行是apply 函数的axis 参数。如果我们通过1,这就像@missmith 逐一迭代数据框行

以上是关于比较熊猫系列中连续行的字符串值的主要内容,如果未能解决你的问题,请参考以下文章

比较Scala中连续行中的列值

查询以计算Mysql中连续行中距离(经度,纬度)的总和

如何将连续行填充到熊猫数据框?

用列/系列中的值替换熊猫子字符串

如何根据字典替换熊猫系列中的字符串组,并将值作为列表?

替换熊猫数据框系列中的每个值[重复]