我有一个小问题:我的 DataFrame 中有一个列,它有多行,每行包含 1 个或多个以“M”字母开头,后跟 3 位数字的值。如果值超过 1 个,则用逗号分隔。我想打印出 DataFrame 的视图,仅包含其中 1 列保存我指定的值的行(例如,我希望它们保存列表 ['M111', 'M222'] 中的任何项目。我已经开始构建我的布尔掩码的方式如下:
df[df['Column'].apply(lambda x: x.split(', ').isin(['M111', 'M222']))]
Run Code Online (Sandbox Code Playgroud)
在我看来, .apply() 和 .split() 方法首先将“Column”值转换为每行中包含 1 个或多个值的列表,然后 .isin() 方法确认是否有任何项目每行中的项目列表都在指定值列表中 ['M111', 'M222']。然而在实践中,我没有得到所需的 DataFrame 视图,而是收到错误
'TypeError: unhashable type: 'list'
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
亲切的问候,格力姆
我认为你需要:
df2 = df[df['Column'].str.contains('|'.join(['M111', 'M222']))]
Run Code Online (Sandbox Code Playgroud)
您只能isin()使用 Pandas 对象访问该方法。但split()返回一个列表。包裹split()在一个Serieswill 中:
# sample data
data = {'Column':['M111, M000','M333, M444']}
df = pd.DataFrame(data)
print(df)
Column
0 M111, M000
1 M333, M444
Run Code Online (Sandbox Code Playgroud)
现在包裹split()在一个Series.
请注意,isin()将返回一个布尔值列表,每个布尔值对应来自split(). 您想知道“列表中的任何项目...是否在指定值的列表中”,因此添加any()到您的apply函数中。
df[df['Column'].apply(lambda x: pd.Series(x.split(', ')).isin(['M111', 'M222']).any())]
Run Code Online (Sandbox Code Playgroud)
输出:
Column
0 M111, M000
Run Code Online (Sandbox Code Playgroud)
正如其他人指出的那样,有更简单的方法可以实现您的最终目标。但这是解决您遇到的具体问题的方法isin()。
| 归档时间: |
|
| 查看次数: |
10179 次 |
| 最近记录: |