我将提出一个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
(如果我们真的想要,我们可以对列进行排序。)
在这里复制整个教程是没有意义的——虽然你可以阅读重塑教程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
(在屏幕上看起来更好。)它给了我们额外的“价值”级别,这是您不想要的,所以让我们放弃它:
>>> 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")