在python中,将csv文件与某些相同或不同的列合并

在python中,将csv文件与某些相同或不同的列合并,python,pandas,csv,merge,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

我是新的编码,我有一个问题合并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
我对基于共享列(年份、国家)将所有癌症类型加入一个数据框架感兴趣。 我尝试过不同的方法,但它们似乎都重复了年份和国家(如下所示)

  • 这篇文章不错,但我有两个专栏,分别是“年份”和“国家”

    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个相同的列,分别代表年份和国家


    如果可能,如何将所有独立的值(癌症类型和相关ASR(标准化风险)和SE值)与年份、国家(和性别)中的一列合并?是的,如果使用,也可以,但随后会与其他列名称重复:

    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
    

    但我认为更好的方法是首先将所有数据帧与
    axis=0
    结合在一起,默认值是什么,所以应该被删除,最后由和进行重塑:


    使用
    axis=0
    进行Concat以按行合并它们


    使用
    axis=1
    时,您要求它并排连接。

    我认为@jezrael的回答对您的问题相当全面,但您还应该考虑:您的格式是否与“整洁数据”格式一致?;只有我的50美分:谢谢你的回复,耶斯雷尔。太棒了!还有,谢谢Quant Christo。我同意这不是最好的格式。我将重新格式化,使所有变量分组,而不是像上面那样分开!
    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
    
    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