繁体   English   中英

Pandas .isin()用于列的每一行中的值列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM