【问题标题】:Filtering a column of lists of strings in a Pandas DataFrame在 Pandas DataFrame 中过滤一列字符串列表
【发布时间】:2021-02-08 02:53:11
【问题描述】:
df=pd.DataFrame({'sym':['A', 'B', 'C', 'D'],'event':[['1','2', '3'], ['1'], ['2', '3'],['2']]} )

df

    sym event
0   A   [1, 2, 3]
1   B   [1]
2   C   [2, 3]
3   D   [2]

事件列由字符串列表组成。我正在尝试过滤包含“3”的任何行的事件列,因此我正在寻找索引 0 和 2。

我知道使用

["3" in df.event[0]]

对于每一行,我认为 lambda 函数会将我推过终点线。

【问题讨论】:

  • df[df.event.astype(str).str.contains('3')]?或者你想要的输出是什么?
  • 就是这样。完美的。谢谢

标签: pandas dataframe filter


【解决方案1】:

请尝试:

print(df[df.event.astype(str).str.contains(r'\b3\b')])



sym      event
0   A  [1, 2, 3]
2   C     [2, 3]

【讨论】:

  • 这也会过滤“33”~
  • 谢谢,已编辑以确保只选择了 3 个
【解决方案2】:

Series.explode to split list-like values to rows

使用explode 将列表转为行:

'3' in df['event'].explode().values

要查找哪一行包含“3”,请使用索引:

idx = df['event'].explode() == '3'
df.loc[idx[idx].index]

【讨论】:

  • 谢谢。那么我将如何过滤 df['event'] 包含“3”的 df rows 行?
  • 你可以使用行的索引。如explode 保留行的原始索引。
  • 你也可以这样做:df['event'].explode().eq('3').any(level=0) with explode 。添加替代方案:)
【解决方案3】:

让我们试试

out = df[pd.DataFrame(df.event.tolist()).isin(['3']).any(1).values]
Out[78]: 
  sym      event
0   A  [1, 2, 3]
2   C     [2, 3]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 2013-08-01
    • 2019-10-03
    相关资源
    最近更新 更多