gpt4 book ai didi

python - 在 Pandas 中做一个几乎不完整的数据透视表操作

转载 作者:太空宇宙 更新时间:2023-11-04 02:17:50 24 4
gpt4 key购买 nike

我有一个如下所示的数据框:

values = random.sample(range(1, 101), 15)

df = pd.DataFrame({'x': [3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4], 'n': [100, 100, 100, 'reference', 'reference', 'reference', 500, 500, 500, 100, 100, 100, 'reference', 'reference', 'reference'], 'value': values})

n 列中标记为“reference”的值是引用值,我最终将根据这些值进行绘制。为了解决这个问题,我需要制作一个在不同列中具有引用值的数据框,因此 columns = ['x', 'n', 'value', 'value_reference']

Value reference是n所有值的引用值,只要x相同即可。因此,我想制作如下数据框:

desired_df = pd.DataFrame({'x': [3, 3, 3, 3, 3, 3, 4, 4, 4], 'n': [100, 100, 100, 500, 500, 500, 100, 100, 100], 'value': [values[i] for i in [0, 1, 2, 6, 7, 8, 9, 10, 11]], 'value_reference':[values[i] for i in [3, 4, 5, 3, 4, 5, 12, 13, 14]]})

我通过硬编码得到了我想要制作可重现示例的结果。但是,我正在寻找执行此操作的正确方法。

如何做到这一点?

谢谢, jack

最佳答案

一种方式可能是这样的:

df["tick"] = df.groupby(["x", "n"]).cumcount()

numbers = df.loc[df["n"] != "reference"]
ref = df.loc[df["n"] == "reference"]
ref = ref.drop("n", axis=1).rename(columns={"value": "reference"})

out = numbers.merge(ref).drop("tick", axis=1)
out = out.sort_values(["x", "n"])

这给了我

In [282]: out
Out[282]:
x n value reference
0 3 100 6 67
2 3 100 9 29
4 3 100 34 51
1 3 500 42 67
3 3 500 36 29
5 3 500 12 51
6 4 100 74 5
7 4 100 48 37
8 4 100 7 70

一步一步,首先我们添加一个勾号列,这样我们就知道哪一行值与哪一行引用相匹配:

In [290]: df
Out[290]:
x n value tick
0 3 100 6 0
1 3 100 9 1
2 3 100 34 2
3 3 reference 67 0
4 3 reference 29 1
5 3 reference 51 2
6 3 500 42 0
7 3 500 36 1
8 3 500 12 2
9 4 100 74 0
10 4 100 48 1
11 4 100 7 2
12 4 reference 5 0
13 4 reference 37 1
14 4 reference 70 2

然后我们分离出表的值和引用部分:

In [291]: numbers = df.loc[df["n"] != "reference"]
...: ref = df.loc[df["n"] == "reference"]
...: ref = ref.drop("n", axis=1).rename(columns={"value": "reference"})
...:
...:

In [292]: numbers
Out[292]:
x n value tick
0 3 100 6 0
1 3 100 9 1
2 3 100 34 2
6 3 500 42 0
7 3 500 36 1
8 3 500 12 2
9 4 100 74 0
10 4 100 48 1
11 4 100 7 2

In [293]: ref
Out[293]:
x reference tick
3 3 67 0
4 3 29 1
5 3 51 2
12 4 5 0
13 4 37 1
14 4 70 2

然后我们合并,合并将对齐共享列,即“x”和“tick”。一种清理方法,我们就完成了。

关于python - 在 Pandas 中做一个几乎不完整的数据透视表操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52250023/

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