pandas 基于一列和另一列的不同类型过滤 Dataframe

aiazj4mn  于 2022-12-21  发布在  其他
关注(0)|答案(2)|浏览(140)

我有以下问题

import pandas as pd

data = {
  "ID": [420, 380, 390, 540, 520, 50, 22],
  "duration": [50, 40, 45,33,19,1,3],
  "next":["390;50","880;222"  ,"520;50"  ,"380;111"   ,"810;111" ,"22;888" ,"11" ]

}

#load data into a DataFrame object:
df = pd.DataFrame(data)

print(df)

如你所见

ID  duration     next
0  420        50   390;50
1  380        40  880;222
2  390        45   520;50
3  540        33  380;111
4  520        19  810;111
5   50         1   22;888
6   22         3       11

注意事项:

  • ID类型为整型
  • next类型是一个字符串,数字之间用;如果多于两个数字

我想过滤ID中没有next的行
例如在这个例子中

  • 420在390和50中均有随访
  • 380具有下一个880和222,这两个都不在ID中,因此这一个
  • 540具有下一个380和111,而111不在ID中,因此380不是此ID
  • 与50相同

最后我想得到
在只有一个值的情况下,我使用了print(df[~df.next.astype(int).isin(df.ID)]),但在这种情况下,isin不能简单地应用。
我该怎么做呢?

gopyfrb3

gopyfrb31#

让我们尝试使用split,然后使用isin检查explode

s = df.next.str.split(';').explode().astype(int)
out = df[~s.isin(df['ID']).groupby(level=0).any()]
Out[420]: 
    ID  duration     next
1  380        40  880;222
4  520        19  810;111
6   22         3       11
htzpubme

htzpubme2#

使用带单词边界的正则表达式以提高效率:

pattern = '|'.join(df['ID'].astype(str))

out = df[~df['next'].str.contains(fr'\b(?:{pattern})\b')]

输出:

ID  duration     next
1  380        40  880;222
4  520        19  810;111
6   22         3       11

相关问题