一个框架有两个柱子。一个是每行只有一个整数。另一个有一个多个整数的字符串,每行由','分隔:
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
代码或方法中的错误是什么?
2条答案
按热度按时间w41d8nur1#
你几乎在那里,但不必要地使用了一个名单,并交换了名字:
输出量:
但是请注意,这种方法可能会失败,因为您依赖于整个字符串,并且
4
将在1, 14, 20
中找到。你可以用
split
代替字符串:最后,由于
axis=1
上的apply
很慢,你可以用一个列表解析来代替整个过程:laawzig22#
你有两个问题,你需要替换
DucksOfInterests
和DuckIDs
的顺序,你需要将字符串转换为int列表,而不是将int转换为字符串,"4" in "3, 11, 14, 27"
将返回True
。