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

pandas dataframe get rows when list values in specific columns meet certain condition

提问人:Cranjis 提问时间:4/9/2023 更新时间:4/9/2023 访问量:82

问:

我有一个数据帧:

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]

最好的方法是什么?

Python Pandas DataFrame 数据整理

评论


答:

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

您可以

  1. 将列表按列分解为行B
  2. 根据索引组检查行是否都大于且等于 0.5
  3. 布尔值索引 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]