- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这篇文章涵盖了 Modification of a function to return a dataframe with specified values我想进一步修改输出。当前函数和向量化版本将获取所有列的组合相减并相应地返回相关数据。
示例和测试数据:
import pandas as pd
import numpy as np
from itertools import combinations
df2 = pd.DataFrame(
{'AAA' : [80,5,6],
'BBB' : [85,20,30],
'CCC' : [100,50,25],
'DDD' : [98,50,25],
'EEE' : [103,50,25],
'FFF' : [105,50,25],
'GGG' : [109,50,25]});
df2
AAA BBB CCC DDD EEE FFF GGG
0 80 85 100 98 103 105 109
1 5 20 50 50 50 50 50
2 6 30 25 25 25 25 25
v = df2.values
df3 = df2.mask((np.abs(v[:, :, None] - v[:, None]) <= 5).sum(-1) <= 1)
df3
AAA BBB CCC DDD EEE FFF GGG
0 80.0 85.0 100 98 103 105 109
1 NaN NaN 50 50 50 50 50
2 NaN 30.0 25 25 25 25 25
thresh 内的所有值(此处为 5)按行返回 np.abs <=5
.
需要改变什么?
在df3
的第一行thresh (80,85) 和 (100,98,103,105,109) 中有两组值。它们都是有效的,但是是两个独立的组,不在 thresh
内。 .我希望能够根据另一个 thresh
来分离这些值值(value)。
我试图用下面的(有缺陷的)代码来证明我想做什么,并且只是包括这个来表明我试图自己推进这个..
df3.mask(df3.apply(lambda x : x >= df3.T.max() \
- (thresh * 3))).dropna(thresh=2).dropna(axis=1)
AAA BBB
0 80.0 85.0
df3.mask(~df3.apply(lambda x : x >= df3.T.max() - (thresh * 3))).dropna(axis=1)
CCC DDD EEE FFF GGG
0 100 98 103 105 109
1 50 50 50 50 50
2 25 25 25 25 25
所以我的输出很好(并且显示接近期望的输出)但是我得到它的方式不是很好......
---期望的输出:---
我用了多行来演示,但是当我使用这段代码时,它只会是一行需要输出和拆分。因此,所需的输出是根据此示例为行 0
返回单独的列.
CCC DDD EEE FFF GGG
0 100 98 103 105 109
和
AAA BBB
0 80.0 85.0
最佳答案
我觉得这值得单独回答。
我编写了一个在一维数组上运行的聚类函数。我知道如何将它进一步矢量化到二维,但我还没有做到。实际上,我使用 np.apply_along_axis
此功能在 answer 中有描述对此question .我鼓励您点击链接,看看为获得这个看似简单的功能所做的工作。
它的作用是在由每个点的左右边距定义的数组中找到簇。它排序,然后聚类,然后取消排序。
增量聚类函数
def delta_cluster(a, dleft, dright):
s = a.argsort()
y = s.argsort()
a = a[s]
rng = np.arange(len(a))
edge_left = a.searchsorted(a - dleft)
starts = edge_left == rng
edge_right = np.append(0, a.searchsorted(a + dright, side='right')[:-1])
ends = edge_right == rng
return (starts & ends).cumsum()[y]
手头的问题
使用 np.apply_along_axis
对 df2
中的每一行使用聚类函数,并构造一个名为 clusters
的 DataFrame
镜像与 df2
相同的索引和列。然后stack
得到一个Series
,方便后面的操作。
clusters = pd.DataFrame(
np.apply_along_axis(delta_cluster, 1, df2.values, 10, 10),
df2.index, df2.columns).stack()
这描述了下一个代码块。
groupby
时,我需要保留df2
的行信息。 transform
获取每行的簇大小。 stack
df2
的值并将簇值附加为索引的一部分。这可以实现您正在寻找的分离。mask
val
其中 size
等于 1。这些是单例集群。lvl0 = clusters.index.get_level_values(0)
size = clusters.groupby([lvl0, clusters]).transform('size')
val = df2.stack().to_frame('value').set_index(clusters, append=True).value
val.mask(size.values == 1).dropna().unstack(1)
AAA BBB CCC DDD EEE FFF GGG
0 1 80.0 85.0 NaN NaN NaN NaN NaN
2 NaN NaN 100.0 98.0 103.0 105.0 109.0
1 3 NaN NaN 50.0 50.0 50.0 50.0 50.0
2 2 NaN 30.0 25.0 25.0 25.0 25.0 25.0
除了我将第一行分成两行外,这与您的结果相匹配。
AAA BBB CCC DDD EEE FFF GGG
0 80.0 85.0 100 98 103 105 109
1 NaN NaN 50 50 50 50 50
2 NaN 30.0 25 25 25 25 25
关于python - 根据值拆分数据帧输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41387749/
我是一名优秀的程序员,十分优秀!