gpt4 book ai didi

python - 使用 python 聚合 CSV 文件

转载 作者:行者123 更新时间:2023-11-28 20:45:01 25 4
gpt4 key购买 nike

我的交叉制表 CSV 文件如下所示:

Country,Age,All,M,F
UK,Under65,30987,15000,15987
UK,65andOver,12345,6345,6000
Germany,Under65,32646,15642,17004
Germany,65andOver,14747,7192,7555
France,Under65,31587,16286,15301
France,65andOver,13741,6187,7554

我想修改它,让它看起来像这样:

Country,Under65_All,Under65_M,Under65_F,65andOver_All,65andOver_M,65andOver_F
UK,30987,15000,15987,12345,6345,6000
Germany,32646,15642,17004,14747,7192,7555
France,31587,16286,15301,13741,6187,7554

每个国家/地区现在位于一行,并且列数已扩展(无交叉表)。

我正尝试在 Python 3 中执行此操作。Excel VBA 已出局,因为我在处理一些较大的 CSV 文件时达到了行数限制。

我想我正在尝试做的是一个带有附加“分组依据”步骤的“聚合”。我已经阅读了 CSV 文件并计算了可能有用的各种值:独特国家的数量(3),独特年龄组的数量(2),最终输出文件所需的名称和列数(7 ).

我希望使代码尽可能灵活,以便它可以读取具有 x 个唯一国家/地区和 y 个唯一年龄分组以及 z 个列变量的文件。最终文件将包含一个标题行,其中包含 y*z+1 列,并且低于此 x 行数。

希望这是有道理的,我们将不胜感激任何帮助/指点。

最佳答案

我要提议 pandas解决方案,因为否则你就是在重新发明轮子,但没有办法解决它需要一点时间来适应的事实。好处是,一旦您掌握了它,这样的操作就会变得相对简单。

import pandas as pd

df = pd.read_csv("c.dat")
df = pd.melt(df, id_vars=["Country", "Age"], var_name="Other")
df["Column"] = df.pop("Age") + "_" + df.pop("Other")
df = df.pivot(index="Country", columns="Column")
df.columns = df.columns.droplevel(0)
df.to_csv("out.csv")

产生

>>> !cat out.csv
Country,65andOver_All,65andOver_F,65andOver_M,Under65_All,Under65_F,Under65_M
France,13741,7554,6187,31587,15301,16286
Germany,14747,7555,7192,32646,17004,15642
UK,12345,6000,6345,30987,15987,15000

(如果我们真的想的话,我们可以在其中对列进行排序。)


在这里复制整个教程没有意义——尽管您可以阅读 reshape 教程 here -- 但我至少可以概述一下这是如何工作的。

循序渐进。首先,我们将 csv 文件读入 DataFrame(有点像 excel 表):

>>> df = pd.read_csv("c.dat")
>>> df
Country Age All M F
0 UK Under65 30987 15000 15987
1 UK 65andOver 12345 6345 6000
2 Germany Under65 32646 15642 17004
3 Germany 65andOver 14747 7192 7555
4 France Under65 31587 16286 15301
5 France 65andOver 13741 6187 7554

您可以在其中按行、列等访问框架。为了您的目的,我们可以融合(逆透视)此数据:

>>> df = pd.melt(df, id_vars=["Country", "Age"], var_name="Other")
>>> df
Country Age Other value
0 UK Under65 All 30987
1 UK 65andOver All 12345
2 Germany Under65 All 32646
3 Germany 65andOver All 14747
4 France Under65 All 31587
5 France 65andOver All 13741
6 UK Under65 M 15000
7 UK 65andOver M 6345
8 Germany Under65 M 15642
9 Germany 65andOver M 7192
10 France Under65 M 16286
11 France 65andOver M 6187
12 UK Under65 F 15987
13 UK 65andOver F 6000
14 Germany Under65 F 17004
15 Germany 65andOver F 7555
16 France Under65 F 15301
17 France 65andOver F 7554

现在我们有了所需的行标签(国家/地区)和有关其他列的信息,无论它们是什么,以及值。您想要“年龄”和“其他”中的任何内容相结合,所以:

>>> df["Column"] = df.pop("Age") + "_" + df.pop("Other")
>>> df
Country value Column
0 UK 30987 Under65_All
1 UK 12345 65andOver_All
2 Germany 32646 Under65_All
3 Germany 14747 65andOver_All
4 France 31587 Under65_All
5 France 13741 65andOver_All
6 UK 15000 Under65_M
7 UK 6345 65andOver_M
8 Germany 15642 Under65_M
9 Germany 7192 65andOver_M
10 France 16286 Under65_M
11 France 6187 65andOver_M
12 UK 15987 Under65_F
13 UK 6000 65andOver_F
14 Germany 17004 Under65_F
15 Germany 7555 65andOver_F
16 France 15301 Under65_F
17 France 7554 65andOver_F

现在所有的艰苦工作都完成了。我们只需调用 pivot 来转动它:

>>> df = df.pivot(index="Country", columns="Column")
>>> df
value \
Column 65andOver_All 65andOver_F 65andOver_M Under65_All Under65_F
Country
France 13741 7554 6187 31587 15301
Germany 14747 7555 7192 32646 17004
UK 12345 6000 6345 30987 15987


Column Under65_M
Country
France 16286
Germany 15642
UK 15000

(在屏幕上看起来更好。)它给了我们额外的“值(value)”级别,这是您不想要的,所以让我们放弃它:

>>> df.columns = df.columns.droplevel(0)
>>> df
Column 65andOver_All 65andOver_F 65andOver_M Under65_All Under65_F \
Country
France 13741 7554 6187 31587 15301
Germany 14747 7555 7192 32646 17004
UK 12345 6000 6345 30987 15987

Column Under65_M
Country
France 16286
Germany 15642
UK 15000

然后我们将其写入 csv:

>>> df.to_csv("out.csv")

关于python - 使用 python 聚合 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24518980/

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