Панды - добавить DataFrame с различными столбцами в цикл for - PullRequest
0 голосов
/ 08 мая 2018

Я боролся с добавлением нескольких DataFrames с переменным columns и буду очень признателен за помощь в решении этой проблемы!

Мой исходный набор данных выглядит следующим образом

 df1 = height 10
       color  25
       weight 3
       speed  33

 df2 = height 51
       color  25
       weight 30
       speed  33

 df3 = height 51
       color  25
       speed 30

Я вызываю функцию transform_csv_data(csv_data, row), чтобы сначала добавить name в последний ряд. Затем я transpose и перемещаю name, который становится последним столбцом в первый столбец для каждого DataFrame, чтобы каждый DataFrame выглядел так, как показано ниже, до добавления (но до перемещения последнего столбца вперед)

df1 = 
   0        1       2       3       4
0  height   color   weight  speed   name
1  10       25      3       33      Joe

df2 =
   0        1       2       3       4
0  height   color   weight  speed   name
1  51       25      30      33      Bob

df3 = 
   0        1       2       3        
0  height   color   speed   name    
1  51       25      30      Chris

Проблема заключается в добавлении DataFrames с различным номером columns, и каждый DataFrame содержит две строки, включая header и Data, как указано выше.

Код для transform_csv_data вспомогательной функции показан ниже

def transform_csv_data(self, csv_data, row):
    df = pd.DataFrame(list(csv_data))

    df = df.iloc[:, [0, -2]]  # all rows with first and second last column
    df.loc[len(df)] = ['name', row]

    df = df.transpose()

    cols = df.columns.values.tolist() # this returns index of each column
    cols.insert(0, cols.pop(-1))  # move last column to front
    df = df.reindex(columns=cols)

    return df

Моя основная функция для добавления DataFrame показана ниже

def aggregate_data(self, output_data_file_path):
    df_output = pd.DataFrame()
    rows = ['Joe', 'Bob', 'Chris']

    for index, row in enumerate(rows):

        csv_data = self.read_csv_url(row)
        df = self.transform_csv_data(csv_data, row)

        # ignore header unless first set of data is being processed
        if index != 0 or append:
            df = df[1:]

        df_output = df_output.append(df)
        df_output.to_csv(output_data_file_path, index=False, header=False, mode='a+')

Я хочу, чтобы мой последний добавленный DatFrame стал таким, как показано ниже, но формат становится странным, поскольку столбец name возвращается к концу column

final = 
 name     height    color   weight  speed
 Joe      10        25      3       33         
 Bob      51        25      30      33      
 Chris    51        25      nan     30      

Как правильно добавить все DataFrame, чтобы data добавлялось к соответствующему column?

Я пытался добавить concat, merge, df_output = df_output.append(df_row)[df_output.columns.tolist()], но пока не повезло

Есть также дубликаты столбцов, которые я хотел бы сохранить.

Большое вам спасибо за помощь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...