我有一个数据框架:
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]
最好的方法是什么?
你可以
- 将
B
列中的列表扩展到 行 - 根据索引组 检查行是否都大于等于0.5
- 布尔索引
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]))])