pandas 行筛选

2021-03-29 21:03:34 +08:00
 badacook
请教一下大家
在 DataFrame 进行行筛选时 一般使用 DataFrame.loc 方法,指定列标签,或者通过列的表达式传入一组 boolean array
如果要 DataFrame 行列比较多,该如何筛选包含指定 字符串的行呢,是通过 pandas.DataFrame.iterrows()对行数据进行历遍匹配
还是有什么其他的好方法没? 以下简单实例 筛选包含 字符'a'的行
df = pd.DataFrame([["x(a)","(ab)","c","d"],["m","2b","2x(3)y","d"],["a","n","c","4(n)e"]])

再就是 不知有没有 pandas 定位检索、增删改查的 cookbook 类的资料可以参考,
还有一个小问题 就是将 DataFrame.applymap(str) 处理时 遇到数值型,结尾含 0 的,直接给去掉了,有没有办法转化是保留
2063 次点击
所在节点    Python
9 条回复
imn1
2021-03-29 22:04:59 +08:00
搜“pandas 像写 sql”能找到一篇文章

类型问题,处理前 astype 转换一下
badacook
2021-03-29 22:22:30 +08:00
@imn1
谢谢大神的提点 那篇文章有搜到过 看过一部分
结合这个 问题我想起来了 apply()相关函数 包含多列处理,返回的是 DataFrame,
可以将 DataFrame.T 对所有行变换成列,返回相关列也就是本身的行,只是需要自定义判断函数
之前看到了 DataFrame.query 函数 也是返回 DataFrame 列,就是其中的 boolean expression 感觉到不到效果
再次感谢 大神的 astype 指点。
wuwukai007
2021-03-29 22:25:25 +08:00
df.loc[(df == 'a').any()]
badacook
2021-03-29 22:36:26 +08:00
@wuwukai007 试过了 完全不对啊
v2sir
2021-03-29 23:03:08 +08:00
要不你先 df.T 一下 ? 逃~
wanv1171
2021-03-30 04:14:13 +08:00
wanv1171
2021-03-30 04:17:50 +08:00
没注意是筛选行,那应该这样 df[df.apply(lambda r: r.str.contains('b', case=False).any(), axis=1)]

https://stackoverflow.com/questions/38980514/most-concise-way-to-select-rows-where-any-column-contains-a-string-in-pandas-dat/43018248
badacook
2021-03-30 07:07:15 +08:00
@wanv1171 非常感谢,Series.str.contains(),与 apply lambda 这种方式 这几天都一直在用,就是这几种结合 any 函数没组合使用过,真香啊,感谢感谢,致敬
HelloViper
2021-03-30 10:08:35 +08:00
series.str.contains 呀,你连续问的问题都是 str 列的内置方法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/766284

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX