[英]Pandas .isin() for list of values in each row of a column
我有一个小问题:我的DataFrame中有一个列,它有多行,并且在每一行中它包含1个或多个值,以“M”字母开头,后跟3个数字。 如果值超过1,则用逗号分隔。 我想打印出一个DataFrame的视图,只显示一行,其中1列保存我指定的值(例如,我希望它们保存列表中的任何项目['M111','M222']。我已经开始构建我的布尔掩码的方式如下:
df[df['Column'].apply(lambda x: x.split(', ').isin(['M111', 'M222']))]
在我看来,.apply()和.split()方法首先将'Column'值转换为每行中包含1个或更多值的列表,然后.isin()方法确认是否有任何项目每行中的项目列表都在指定值列表中['M111','M222']。 然而,在实践中,我得到错误,而不是获得所需的DataFrame视图
'TypeError: unhashable type: 'list'
我究竟做错了什么?
亲切的问候,Greem
我想你需要:
df2 = df[df['Column'].str.contains('|'.join(['M111', 'M222']))]
您只能使用Pandas对象访问isin()
方法。 但split()
返回一个列表。 在Series
包装split()
将起作用:
# sample data
data = {'Column':['M111, M000','M333, M444']}
df = pd.DataFrame(data)
print(df)
Column
0 M111, M000
1 M333, M444
现在将split()
包装在Series
。
请注意, isin()
将返回一个布尔值列表,每个元素对应一个来自split()
元素。 您想知道“列表中的任何项目是否都在指定值列表中”,因此将any()
添加到您的apply
函数中。
df[df['Column'].apply(lambda x: pd.Series(x.split(', ')).isin(['M111', 'M222']).any())]
输出:
Column
0 M111, M000
正如其他人所指出的那样,有更简单的方法可以实现您的最终目标。 但这是如何解决您遇到的isin()
的具体问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.