首页 > 解决方案 > 根据一列中数组的元素选择数据框的行

问题描述

我有一个数据框,其中一列具有一维数组作为值。作为一个玩具示例:

easy={"a":[1,2,3,4,5,6,7,8,9],"b":[9,8,7,6,5,4,3,2,1], "c":[[0.9,0.3,0.1],[0.8,0.7,0.2],[0.7,0.6,0.3],
                                                            [0.6,0.2,0.4],[0.5,0.9,0.5],[0.4,0.8,0.6],
                                                            [0.3,0.5,0.7],[0.2,0.1,0.8],[0.1,0.4,0.9]]}

easy_df=pd.DataFrame(easy) 

    a   b          c
0   1   9   [0.9, 0.3, 0.1]
1   2   8   [0.8, 0.7, 0.2]
2   3   7   [0.7, 0.6, 0.3]
3   4   6   [0.6, 0.2, 0.4]
4   5   5   [0.5, 0.9, 0.5]
5   6   4   [0.4, 0.8, 0.6]
6   7   3   [0.3, 0.5, 0.7]
7   8   2   [0.2, 0.1, 0.8]
8   9   1   [0.1, 0.4, 0.9]

“c”列中的数组原则上可以有很多元素。我想用这个数据框制作另一个数据框,但只有那些行,例如“c”列中数组的任何元素高于某个阈值,例如:0.75。新的数据框应如下所示:

    a   b          c
0   1   9   [0.9, 0.3, 0.1]
1   2   8   [0.8, 0.7, 0.2]
4   5   5   [0.5, 0.9, 0.5]
5   6   4   [0.4, 0.8, 0.6]
7   8   2   [0.2, 0.1, 0.8]
8   9   1   [0.1, 0.4, 0.9]

因为这些是“c”中的数组包含至少一个高于 0.75 的元素的初始数据帧的唯一行。

我试过这样的事情:

easy_df[np.any(easy_df["c"])>0.75]

这显然是错误的,因为我收到错误消息

TypeError: '>' not supported between instances of 'list' and 'float'

PS:“a”和“b”列与问题无关,因为它们可能有任意元素。

标签: arrayspandasdataframe

解决方案


您可以将一系列列表转换为数据框并检查是否有任何列大于阈值:

thresh = 0.75
easy_df[pd.DataFrame(easy_df['c'].tolist()).gt(thresh).any(1)]

或者使用带有任何级别 = 0 的聚合的爆炸:

df[easy_df['c'].explode().gt(thresh).any(level=0)]

   a  b                c
0  1  9  [0.9, 0.3, 0.1]
1  2  8  [0.8, 0.7, 0.2]
4  5  5  [0.5, 0.9, 0.5]
5  6  4  [0.4, 0.8, 0.6]
7  8  2  [0.2, 0.1, 0.8]
8  9  1  [0.1, 0.4, 0.9]

编辑:根据评论,您可以在axis = 1上添加一个idxmax:

thresh = 0.75
ref = pd.DataFrame(easy_df['c'].tolist())
out = easy_df[ref.gt(thresh).any(1)].assign(d=ref.idxmax(1))
print(out)

   a  b                c  d
0  1  9  [0.9, 0.3, 0.1]  0
1  2  8  [0.8, 0.7, 0.2]  0
4  5  5  [0.5, 0.9, 0.5]  1
5  6  4  [0.4, 0.8, 0.6]  1
7  8  2  [0.2, 0.1, 0.8]  2
8  9  1  [0.1, 0.4, 0.9]  2

推荐阅读