pandas 检查一列的整数是否在另一列的整数字符串中

disbfnqx  于 2023-10-14  发布在  其他
关注(0)|答案(2)|浏览(129)

一个框架有两个柱子。一个是每行只有一个整数。另一个有一个多个整数的字符串,每行由','分隔:

import pandas as pd
duck_ids = ["1, 4, 5, 7", "3, 11, 14, 27"]
ducks_of_interest = [4,15]
duck_df = pd.DataFrame(
    {
        "DucksOfInterests": ducks_of_interest,
        "DuckIDs": duck_ids
    }
)
print(f"The starting dataframe:\n{duck_df}")

   DucksOfInterests        DuckIDs
0                 4     1, 4, 5, 7
1                15  3, 11, 14, 27

如果感兴趣的Duck在Duck ID集内,则需要一个返回True的新列。这是使用一个简单的lambda函数和.apply方法来尝试的:

duck_df['DoIinDIDs'] = duck_df.apply(lambda x: str(x['DuckIDs']) in [x['DucksOfInterests']], axis=1)

这应该会为第一行返回True,因为4是“1,4,5,7”中的数字,而为第二行返回False。但是,两行的结果都为False:

print(f"The dataframe with the additional column:\n{duck_df}")

   DucksOfInterests        DuckIDs  DoIinDIDs
0                 4     1, 4, 5, 7      False
1                15  3, 11, 14, 27      False

代码或方法中的错误是什么?

w41d8nur

w41d8nur1#

你几乎在那里,但不必要地使用了一个名单,并交换了名字:

duck_df['DoIinDIDs'] = duck_df.apply(lambda x: str(x['DucksOfInterests'])
                                     in x['DuckIDs'], axis=1)

输出量:

DucksOfInterests        DuckIDs  DoIinDIDs
0                 4     1, 4, 5, 7       True
1                15  3, 11, 14, 27      False

但是请注意,这种方法可能会失败,因为您依赖于整个字符串,并且4将在1, 14, 20中找到。
你可以用split代替字符串:

duck_df['DoIinDIDs'] = duck_df.apply(lambda x: str(x['DucksOfInterests'])
                                     in x['DuckIDs'].split(', '), axis=1)

最后,由于axis=1上的apply很慢,你可以用一个列表解析来代替整个过程:

duck_df['DoIinDIDs'] = [str(a) in b.split(', ')
                        for a, b in zip(duck_df['DucksOfInterests'],
                                        duck_df['DuckIDs'])]
laawzig2

laawzig22#

你有两个问题,你需要替换DucksOfInterestsDuckIDs的顺序,你需要将字符串转换为int列表,而不是将int转换为字符串,"4" in "3, 11, 14, 27"将返回True

duck_df['DoIinDIDs'] = duck_df.apply(lambda x: x['DucksOfInterests'] in map(int, x['DuckIDs'].split(',')), axis=1)

相关问题