arrays - 根据一列中数组的元素选择数据框的行
问题描述
我有一个数据框,其中一列具有一维数组作为值。作为一个玩具示例:
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”列与问题无关,因为它们可能有任意元素。
解决方案
您可以将一系列列表转换为数据框并检查是否有任何列大于阈值:
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
推荐阅读
- hyperledger-fabric - 如何在 Hyperledger Fabric 的不同节点上多次安装一份合约?
- docker - 通过 docker-compose 使用主机网络
- php - MySQL 多个 LEFT JOIN 返回重复的行
- ios - 何时为具有动态高度的自定义 UITableViewCell 设置 shadowPath 值
- android - 向下滚动时不要折叠 AppBarLayout
- dart - Flutter 切换到 Tab 重新加载小部件并运行 FutureBuilder
- react-native - ReactNative - 带有 redux 的抽屉导航器
- c# - 在 Asp.NetCore Web API 中将 foreach 用于 C# 的电子邮件
- ballerina - 我们如何从 HTTP 请求中解压 JSON 文件
- reactjs - 如何在 Browserify 中使用 React 编译 Elm