Python Pandas объединяет и обновляет фрейм данных - PullRequest
0 голосов
/ 07 января 2019

В настоящее время я использую Python и Pandas для формирования «базы данных» цен на акции. Мне удалось найти некоторые коды, чтобы скачать цены на акции.

df1 - моя существующая база данных. Каждый раз, когда я загружаю цену за акцию, она будет выглядеть как df2 и df3. Затем мне нужно объединить данные df1, df2 и df3, чтобы они выглядели как df4.

У каждой акции есть свой столбец. У каждой даты есть свой ряд.

df1: Существующая база данных

+----------+-------+----------+--------+
|   Date   | Apple | Facebook | Google |
+----------+-------+----------+--------+
| 1/1/2018 |   161 |       58 |   1000 |
| 2/1/2018 |   170 |       80 |        |
| 3/1/2018 |   190 |       84 |    100 |
+----------+-------+----------+--------+

df2: новые данные (01.02.2017 и 01.04.2017) и обновленные данные (01.03.2017) для Google.

+----------+--------+
|   Date   | Google |
+----------+--------+
| 2/1/2018 |    500 |
| 3/1/2018 |    300 |
| 4/1/2018 |    200 |
+----------+--------+

df3: новые данные для Amazon

+----------+--------+
|   Date   | Amazon |
+----------+--------+
| 1/1/2018 |   1000 |
| 2/1/2018 |   1500 |
| 3/1/2018 |   2000 |
| 4/1/2018 |   3000 |
+----------+--------+

df4 Окончательный вывод: в основном он объединяет и обновляет все данные в базе данных. (df1 + df2 + df3) -> это будет обновленная база данных df1

+----------+-------+----------+--------+--------+
|   Date   | Apple | Facebook | Google | Amazon |
+----------+-------+----------+--------+--------+
| 1/1/2018 |   161 |       58 |   1000 |   1000 |
| 2/1/2018 |   170 |       80 |    500 |   1500 |
| 3/1/2018 |   190 |       84 |    300 |   2000 |
| 4/1/2018 |       |          |    200 |   3000 |
+----------+-------+----------+--------+--------+

Я не знаю, как объединить df1 и df3.

И я не знаю, как объединить df1 и df2 (добавить новую строку: 01.04.2017), одновременно обновляя данные (01.02.2008 -> Исходные данные: NaN; исправленные данные: 500 | 01.03.2008 -> Исходные данные: 100; исправленные данные: 300) и оставив существующие нетронутыми данные (01.01.2017).

Может кто-нибудь помочь мне получить df4? =)

Спасибо.

РЕДАКТИРОВАТЬ: Основываясь на предложении социопата, я изменил код:

dataframes = [df2, df3]
df4 = df1

for i in dataframes:
    # Merge the dataframe
    df4 = df4.merge(i, how='outer', on='date')

    # Get the stock name
    stock_name = i.columns[1]

    # To check if there is any column with "_x", if have, then combine these columns
    if stock_name+"_x" in df4.columns:
        x = stock_name+"_x"
        y = stock_name+"_y"
        df4[stock_name] = df4[y].fillna(df4[x])
        df4.drop([x, y], 1, inplace=True)

1 Ответ

0 голосов
/ 07 января 2019

Вам нужно merge:

df1 = pd.DataFrame({'date':['2/1/2018','3/1/2018','4/1/2018'], 'Google':[500,300,200]})
df2 = pd.DataFrame({'date':['1/1/2018','2/1/2018','3/1/2018','4/1/2018'], 'Amazon':[1000,1500,2000,3000]})
df3 = pd.DataFrame({'date':['1/1/2018','2/1/2018','3/1/2018'], 'Apple':[161,171,181], 'Google':[1000,None,100], 'Facebook':[58,75,65]})

Если столбец отсутствует в текущей базе данных, просто используйте merge, как показано ниже

df_new = df3.merge(df2, how='outer',on=['date'])

Если столбец присутствует в БД, используйте fillna для обновления значений, как показано ниже:

df_new = df_new.merge(df1, how='outer', on='date')
#print(df_new)
df_new['Google'] = df_new['Google_y'].fillna(df_new['Google_x'])
df_new.drop(['Google_x','Google_y'], 1, inplace=True)

Выход:

    date       Apple    Facebook    Amazon  Google
0   1/1/2018    161.0   58.0        1000    1000.0
1   2/1/2018    171.0   75.0        1500    500.0
2   3/1/2018    181.0   65.0        2000    300.0
3   4/1/2018    NaN     NaN         3000    200.0

EDIT

Более общее решение для последующей части.

dataframes = [df2, df3, df4]  

for i in dataframes:
    stock_name = list(i.columns.difference(['date']))[0]
    df_new = df_new.merge(i, how='outer', on='date')
    x = stock_name+"_x"
    y = stock_name+"_y"

    df_new[stock_name] = df_new[y].fillna(df_new[x])
    df_new.drop([x,y], 1, inplace=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...