Слияние CSV-файлов с одними и теми же столбцами, а другие - в Python. - PullRequest
1 голос
/ 14 октября 2019

Я новичок в кодировании, и у меня возникла проблема с объединением 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 одинаковых столбцов для ГОДА и 5 для СТРАНЫ.

Любые идеи о том, как объединить все значения, которые являются независимыми (Тип рака и связанный с ним ASR (стандартизированный риск) и значения SE) только с одним столбцом для ГОДА, СТРАНЫ (и ГЕНДЕРА), если возможно?

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Да, это возможно, если использовать 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 и 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
0 голосов
/ 14 октября 2019

Concat с axis=0, чтобы объединить их по строкам.

с axis=1 вы запрашиваете его в Concat из стороны в сторону.

...