首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在给定数据帧中的值或索引列表的情况下对数据帧进行掩码

如何在给定数据帧中的值或索引列表的情况下对数据帧进行掩码
EN

Stack Overflow用户
提问于 2019-07-19 03:51:55
回答 2查看 870关注 0票数 0

我有一个数据帧,它有一列'rel_max‘,其中包含所有局部最大值的列表(如果相关或更有用的话,我还有一列这些局部极值的索引)。我想要获取这个值或索引的列表,并对数据帧进行掩码,以便在其正确的位置有一个最大值,对于数据帧的所有其他值,我有一个NaN或0。

代码语言:javascript
复制
df = pd.DataFrame({'123': [20.908, 8.743, 8.34, 2.4909],
                 '124': [2, 2.34, 0, 4.1234],
                  '412': [2, 20.123, 3.123123, 0],
                   '516': [5, 20.120, 4.12, 0],
                   '129': [6, 20.10, 3.123123, 0],
                    'rel_max': [[20.908, 6], [8.743,20.123], [8.34,4.12], [4.1234]]},

                 index=['2015-01-10', '2015-02-10', '2015-03-10', '2015-04-10'])

这是具有相对最大值的数据帧。^

这是预期的数据帧。

代码语言:javascript
复制
df1 = pd.DataFrame({'123': [20.908, 8.743, 8.34, 0],
                 '124': [0, 0, 0, 4.1234],
                  '412': [0, 20.123, 0, 0],
                   '516': [0, 0, 4.12, 0],
                   '129': [6, 0, 0, 0],
                    'rel_max': [[20.908, 6], [8.743,20.123], [8.34,4.12], [4.1234]]},

                 index=['2015-01-10', '2015-02-10', '2015-03-10', '2015-04-10'])

本质上,我试图检索或拉取仅具有局部极值的数据帧。

代码语言:javascript
复制
               123     124     412   516  129          rel_max
2015-01-10  20.908  0.0000   0.000  0.00    6      [20.908, 6]
2015-02-10   8.743  0.0000  20.123  0.00    0  [8.743, 20.123]
2015-03-10   8.340  0.0000   0.000  4.12    0     [8.34, 4.12]
2015-04-10   0.000  4.1234   0.000  0.00    0         [4.1234]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-19 04:09:11

使用索引。首先获取最小值和最大值,然后使用numpy和pandas broadcasting创建两个掩码m1m2。然后,再次广播

代码语言:javascript
复制
smax = df.rel_max.str[0]
smin = df.rel_max.str[1]

m1 = df == np.broadcast_to(smax.values.reshape(-1,1), df.shape)

m2 = df == np.broadcast_to(smin.values.reshape(-1,1), df.shape)

df[m1 | m2]

更详细地说,smax是具有最大值的序列,而sminmin值的序列。m1True/False值的数据帧。只要df中的一个单元格等于广播值中的一个值,它就会生成True。我建议单独运行代码的每一部分并查看输出,这更直观;)

输出为:

代码语言:javascript
复制
            123     124     412     516     129 rel_max
2015-01-10  20.908  0.0000  0.000   0.00    6   [20.908, 6]
2015-02-10  8.743   0.0000  20.123  0.00    0   [8.743, 20.123]
2015-03-10  8.340   0.0000  0.000   4.12    0   [8.34, 4.12]
2015-04-10  0.000   4.1234  0.000   0.00    0   [4.1234]
票数 1
EN

Stack Overflow用户

发布于 2019-07-19 04:09:54

您可以尝试如下所示:

代码语言:javascript
复制
pd.concat([df.iloc[:, :-1].where(df.apply(lambda x: x[:-1].isin(x.iloc[-1]), axis=1), 0), 
           df.iloc[:, -1]], axis=1)

输出:

代码语言:javascript
复制
               123     124     412   516  129          rel_max
2015-01-10  20.908  0.0000   0.000  0.00  6.0      [20.908, 6]
2015-02-10   8.743  0.0000  20.123  0.00  0.0  [8.743, 20.123]
2015-03-10   8.340  0.0000   0.000  4.12  0.0     [8.34, 4.12]
2015-04-10   0.000  4.1234   0.000  0.00  0.0         [4.1234]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57101758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档