python - 在python中合并某些列相同而其他列不同的csv文件

标签 python pandas csv merge

我是编码新手,在合并 csv 文件时遇到问题。我搜索过类似的问题,但没有找到解决办法。只是包含一些相关细节: CSV文件是1950年至2017年不同国家的癌症类型(肺癌、结直肠癌、胃癌、肝癌和乳腺癌) 下面是肺癌布局的一个例子。

 dlung.describe(include='all')   
 dlung


    Year    Cancer  Country     Gender  ASR     SE
0   1950    Lung    Australia   Male    13.89   0.56
1   1951    Lung    Australia   Male    14.84   0.57
2   1952    Lung    Australia   Male    17.19   0.61
3   1953    Lung    Australia   Male    18.21   0.62
4   1954    Lung    Australia   Male    19.05   0.63
5   1955    Lung    Australia   Male    20.65   0.65
6   1956    Lung    Australia   Male    22.05   0.67
7   1957    Lung    Australia   Male    23.93   0.69
8   1958    Lung    Australia   Male    23.77   0.68
9   1959    Lung    Australia   Male    26.12   0.71
10  1960    Lung    Australia   Male    27.08   0.72

我有兴趣根据共享列(年份、国家/地区)将所有癌症类型加入到一个数据框中。 我尝试了不同的方法,但它们似乎都重复年份和国家(如下)

  1. 这个还不错,但我有两列分别代表年份和国家/地区

    df_lung_colorectal = pd.concat([dlung, dcolorectal], axis = 1)
    
    df_lung_colorectal 
    
    Year    Cancer  Country Gender  ASR SE  Year    Cancer  Country Gender  ASR SE
    

如果我继续这样,我最终会得到 5 个相同的 YEAR 列和 5 个 COUNTRY 列。

如果可能的话,关于如何将所有独立值(癌症类型和相关 ASR(标准化风险)和 SE 值)与仅一列“年份”、“国家”(和“性别”)合并有什么想法吗?

最佳答案

是的,如果使用 DataFrame.set_index 是可能的,但随后又重复了另一个列名称:

print (dlung)
   Year Cancer    Country Gender    ASR    SE
0  1950   Lung  Australia   Male  13.89  0.56
1  1951   Lung  Australia   Male  14.84  0.57
2  1952   Lung  Australia   Male  17.19  0.61
3  1953   Lung  Australia   Male  18.21  0.62
4  1954   Lung  Australia   Male  19.05  0.63

print (dcolorectal)
    Year      Cancer    Country Gender    ASR    SE
6   1950  colorectal  Australia   Male  22.05  0.67
7   1951  colorectal  Australia   Male  23.93  0.69
8   1952  colorectal  Australia   Male  23.77  0.68
9   1953  colorectal  Australia   Male  26.12  0.71
10  1954  colorectal  Australia   Male  27.08  0.72
<小时/>
df_lung_colorectal = pd.concat([dlung.set_index(['Year','Country','Gender']), 
                                dcolorectal.set_index(['Year','Country','Gender'])], axis = 1)

print (df_lung_colorectal)
                      Cancer    ASR    SE      Cancer    ASR    SE
Year Country   Gender                                             
1950 Australia Male     Lung  13.89  0.56  colorectal  22.05  0.67
1951 Australia Male     Lung  14.84  0.57  colorectal  23.93  0.69
1952 Australia Male     Lung  17.19  0.61  colorectal  23.77  0.68
1953 Australia Male     Lung  18.21  0.62  colorectal  26.12  0.71
1954 Australia Male     Lung  19.05  0.63  colorectal  27.08  0.72

但我认为更好的是首先将所有 DataFrame 与 axis=0 连接在一起,这是默认值,因此应该删除并最后通过 DataFrame.set_index 进行 reshape 和 DataFrame.unstack :

df = pd.concat([dlung, dcolorectal]).set_index(['Year','Country','Gender','Cancer']).unstack()
df.columns = df.columns.map('_'.join)
df = df.reset_index()
print (df)
   Year    Country Gender  ASR_Lung  ASR_colorectal  SE_Lung  SE_colorectal
0  1950  Australia   Male     13.89           22.05     0.56           0.67
1  1951  Australia   Male     14.84           23.93     0.57           0.69
2  1952  Australia   Male     17.19           23.77     0.61           0.68
3  1953  Australia   Male     18.21           26.12     0.62           0.71
4  1954  Australia   Male     19.05           27.08     0.63           0.72

关于python - 在python中合并某些列相同而其他列不同的csv文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58371292/

相关文章:

python - python 中的默认方法实现(__str__、__eq__、__repr__ 等)

python - Pandas 值错误 : 'Date' is not in list

csv - 如何附加到现有的 CSV 文件?

database - 交错表术语

python - Luigi : The task does not fail even if in the run() method , 我执行了一个不存在的文件

python - Python Paramiko Channel.recv()的实际返回值类型是什么?

python - 如何在 opencv2 python 中调整窗口大小

python - 来自多个不同长度列表的 Pandas 长格式 DataFrame

python - 需要计算数据框中的负值

sql - 转换时转义 XML 特殊字符