Как грамотно объединить Dataframe, как показывают фотографии - PullRequest
1 голос
/ 20 февраля 2020

Я получаю данные из Интернета и хочу объединить их с помощью Key1 и Key2. В идеальном случае мы получили df1 - df6 в последовательности (рисунок 1).

Но в большинстве случаев мы не можем оценить, какую часть данных мы можем получить дальше (рисунок 2).

pic 1 and pic 2

Во втором случае я хочу поместите новые данные в правильное место в соответствии с Key1 и Key1 и именем столбца. Если столбец или строка не существует, для нее следует добавить новый столбец или строку. И недостающие данные заполняются NaN.

Я пробовал объединять, объединять и объединять, но я не могу получить окончательную цель. Теперь моя реализация: объединить df1 - df3 и df4 - df6, получив результат вместе. Но это не достаточно «умно», и иногда произойдет ошибка, если данные не в этой последовательности.

Основной код:

    result_daily = pro.daily(ts_code=ts_code, start_date=ts_since, end_date=ts_until)
    result_adjust = pro.adj_factor(ts_code=ts_code, start_date=ts_since, end_date=ts_until)
    result_index = pro.daily_basic(ts_code=ts_code, start_date=ts_since, end_date=ts_until)

    print(uri + ' - Network finished, time spending: ' + str(clock.elapsed_ms()) + 'ms')

    sub_result = None
    sub_result = merge_on_columns(sub_result, result_daily, ['ts_code', 'trade_date'])
    sub_result = merge_on_columns(sub_result, result_adjust, ['ts_code', 'trade_date'])
    sub_result = merge_on_columns(sub_result, result_index, ['ts_code', 'trade_date'])

    result = pd.concat([result, sub_result], ignore_index=True)

Также merge_on_columns ():

def merge_on_columns(df1: pd.DataFrame, df2: pd.DataFrame, columns: str or [str]):
    if df1 is None:
        return df2
    if df2 is None:
        return df1
    if not isinstance(columns, (list, tuple)):
        columns = [columns]
    # https://stackoverflow.com/questions/19125091/pandas-merge-how-to-avoid-duplicating-columns/19125531#19125531
    diff_cols = list(df2.columns.difference(df1.columns))
    # if len(diff_cols) == 0:
    #     df = pd.merge(df1, df2, how='left', on=columns, sort=False)
    # else:
    merge_columns = diff_cols + columns
    df = pd.merge(df1, df2[merge_columns], how='inner', on=columns, sort=False)
    return df

Может ли кто-нибудь мне помочь. Спасибо.

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