pandas dataframe在特定列中的列表值满足一定条件时获取行



我有一个数据框架:

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]

最好的方法是什么?

你可以

  1. B列中的列表扩展到
  2. 根据索引组
  3. 检查行是否都大于等于0.5
  4. 布尔索引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:

首先驱动一个新列,例如标志,它表示过滤条件的结果。然后使用此标志过滤掉记录。我使用自定义函数来驱动标志值。你可以在自定义函数中做更多的操作。下面的代码:

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]

Method2:

使用lambda一行:

df1 = df1[ df1['B'].apply(lambda x: all([b>0.5 for b in x])) ]
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]

您可以使用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]))])

最新更新