提问人:Cranjis 提问时间:4/9/2023 更新时间:4/9/2023 访问量:82
pandas DataFrame 在特定列中的列表值满足特定条件时获取行
pandas dataframe get rows when list values in specific columns meet certain condition
问:
我有一个数据帧:
df = A B
1 [0.2,0.8]
2 [0.6,0.9]
我只想得到 B 的所有值都>= 0.5 的行 所以在这里:
new_df = A B
2 [0.6, 0.9]
最好的方法是什么?
答:
0赞
bn_ln
4/9/2023
#1
您可以使用来筛选值,apply
import pandas as pd
df = pd.DataFrame({'A': [1,2], 'B':[[0.2, 0.8], [0.6, 0.9]]})
print(df[df['B'].apply(lambda x: all([i>=0.5 for i in x]))])
1赞
Ynjxsjmh
4/9/2023
#2
您可以
- 将列表按列分解为行
B
- 根据索引组检查行是否都大于且等于 0.5
- 布尔值索引 with satisfied 行
df
out = df[df.explode('B')['B'].ge(0.5).groupby(level=0).all()]
print(out)
A B
1 2 [0.6, 0.9]
1赞
dineshydv
4/9/2023
#3
方法1:
首先驱动一个新列,例如标志,指示过滤条件的结果。然后使用此标志筛选出记录。我正在使用自定义函数来驱动标志值。您可以在自定义函数中执行更多操作。 以下代码:
def fun1(r):
flg = all(b>0.5 for b in r['B'])
#print(flg)
r['flg'] = flg
return r
df1 = pd.DataFrame([{'A':1,'B':[0.2,0.8]},{'A':2,'B':[0.6,0.9]}])
#
df1 = df1[df1.apply(fun1, axis=1)['flg']==True]
df1
结果:
A B
2 [0.6, 0.9]
方法2:
使用 lambda one liner:
df1 = df1[ df1['B'].apply(lambda x: all([b>0.5 for b in x])) ]
1赞
Laurent B.
4/9/2023
#4
import pandas as pd
df = pd.DataFrame({'A':[1, 2],
'B':[[0.2,0.8], [0.6,0.9]],
})
mask = df.agg({'B': lambda v: all(map(lambda x: x>0.5, v))})
r = df[mask['B']]
print(r)
A B
1 2 [0.6, 0.9]
评论