如何使用 Pandas 中另一列的长度作为切片参数

How do I use the length of another column in Pandas as a slice argument

我正在尝试从数据框中删除行,其中 Ref 列中的第一个字母序列等于 Product 列。

例如,对于输入:

+---------+---------------+
| Product | Provision Ref |
+---------+---------------+
| DVX     | DVX9251       |
+---------+---------------+
| CDV     | 22CDV95       |
+---------+---------------+
| TV      | TV12369       |
+---------+---------------+
| TV      | 992TV15       |
+---------+---------------+

期望的输出:

+---------+---------------+
| Product | Provision Ref |
+---------+---------------+
| CDV     | 22CDV95       |
+---------+---------------+
| TV      | 992TV15       |
+---------+---------------+

我已经尝试了以下两段代码,但它们都不起作用

df = df.loc[df['Provision Ref'].str[0:df['Product'].map(len)] != df['Product']]
df = df.loc[df['Provision Ref'].str[0:int(df['Product'].map(len))] != df['Product']]

试试这个:

filtered = df[df.groupby('Product', sort=False).apply(lambda g: g['Provision Ref'].str.startswith(g['Product'].iloc[0])).tolist()]

输出:

>>> filtered
  Product Provision Ref
0     DVX       DVX9251
2      TV       TV12369

可读性更高但效率更低:

filtered = df[df.apply(lambda x: x['Provision Ref'].startswith(x['Product']), axis=1)]

另一种方法,如果 Product 的项目几乎没有唯一长度(例如,大多数是 2、3 或 4 个字符长等),则可能更有效:

filtered = df[df.groupby(df['Product'].str.len(), sort=False).apply(lambda x: x['Provision Ref'].str[:len(x['Product'].iloc[0])] == x['Product']).tolist()]

我们可以使用row-wise.apply(),因为 df['Provision Ref'].str.startswith(df['Product']) 不是那样矢量化的(正如@anarchy 所写)。

df[~df.apply(lambda row: row['Provision Ref'].startswith(row['Product']), axis=1)]

  Product Provision Ref
1     CDV       22CDV95
3      TV       992TV15