为了账号安全,请及时绑定邮箱和手机立即绑定

Python/Pandas:获取列中项目的索引

Python/Pandas:获取列中项目的索引

慕田峪9158850 2023-04-18 15:08:24
我有一个包含以下列的 Pandas dataframe(df):df["ids"]0         18281483,16583915471           1268212,1280644302                  13465424253  13591493,13123669,35938208df[“编号”]0      182814831       12682122    13465424253      13123669我想找出“ids”的哪个顺序可以找到相应的“id”,并在新列“order”中输出相应的值。尝试了以下代码但没有成功:df["order"] = df["ids"].str.split(",").index(df["id"])----------------------------------------------------------------------TypeError: 'Int64Index' object is not callable有语法错误吗?我手动尝试了对每一行的拆分和索引函数(通过插入列表和字符串),它起作用了。期望的输出:df[“订单”]0 01 02 0 3 1
查看完整描述

3 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

尝试:


df['output'] = df.astype(str).apply(lambda x: x['ids'].split(',').index(x['id']), axis=1)

输出:


                          ids          id  output

0         18281483,1658391547    18281483       0

1           1268212,128064430     1268212       0

2                  1346542425  1346542425       0

3  13591493,13123669,35938208    13123669       1


查看完整回答
反对 回复 2023-04-18
?
aluckdog

TA贡献1847条经验 获得超7个赞

这是一种方法,


def index_(ids, id):

    split_ = ids.split(",")

    if id in split_:

        return split_.index(id)

    else:

        return -1



print(

    df.assign(id = df1.id.astype(str))

        .apply(lambda x: index_(x.ids, x.id), axis=1)

)

0    0

1    0

2    0

3    1

dtype: int64


查看完整回答
反对 回复 2023-04-18
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

真的不应该apply在这里使用。在更大的 Dataframes 上,它会非常慢。广播比较会工作得很好。


(df["ids"].str.split(",", expand=True) == df["id"][:, None]).idxmax(1)

0    0

1    0

2    0

3    1

dtype: int64

表现


d = {'ids': {0: '18281483,1658391547',

             1: '1268212,128064430',

             2: '1346542425',

             3: '13591493,13123669,35938208'},

      'id': {0: '18281483', 

             1: '1268212', 

             2: '1346542425',

             3: '13123669'}}


df = pd.DataFrame(d)

df = pd.concat([df] * 1000)


%timeit (df["ids"].str.split(",", expand=True) == df["id"][:, None]).idxmax(1)                 

7.51 ms ± 61.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)


%timeit df.apply(lambda x: x['ids'].split(',').index(x['id']), axis=1)                         

54.1 ms ± 249 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)


查看完整回答
反对 回复 2023-04-18
  • 3 回答
  • 0 关注
  • 253 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信