如何使用 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
我正在尝试从数据框中删除行,其中 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