gpt4 book ai didi

python - 根据值拆分数据帧输出

转载 作者:行者123 更新时间:2023-11-28 21:07:29 25 4
gpt4 key购买 nike

这篇文章涵盖了 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_axisdf2 中的每一行使用聚类函数,并构造一个名为 clustersDataFrame镜像与 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com