Попытка объединить 2 кадра данных в пандах на основе мультииндекс - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь объединить 2 фрейма данных, и в настоящее время значения для 2-го фрейма данных добавляются в конец первого, когда я хочу включить его в качестве дополнительного столбца.

1-й фрейм данных

┌──────────┬────────────┬────────────────────┬───────────────────────┬─────────┬────────────────┬────────────┬─────────────────────┬────────────────────┬─────────────────┬────────────────────┬───────────┬──────────────┬────────────────┬───────────────────┬───────────┬────────────┬───────┐
│ filename │    date    │   txVolume(USD)    │ adjustedTxVolume(USD) │ txCount │ marketcap(USD) │ price(USD) │ exchangeVolume(USD) │        fees        │ activeAddresses │ medianTxValue(USD) │ medianFee │ paymentCount │ generatedCoins │ averageDifficulty │ blockSize │ blockCount │ value │
├──────────┼────────────┼────────────────────┼───────────────────────┼─────────┼────────────────┼────────────┼─────────────────────┼────────────────────┼─────────────────┼────────────────────┼───────────┼──────────────┼────────────────┼───────────────────┼───────────┼────────────┼───────┤
│ ada      │ 2017-10-01 │ 436003334.53699994 │         131165286.735 │  3096.0 │            0.0 │   0.021678 │          50068700.0 │         291.170785 │          5973.0 │       18065.296266 │   0.17107 │       1661.0 │                │                   │           │            │       │
│ ada      │ 2017-10-02 │      1025157737.96 │          151391424.74 │  2943.0 │            0.0 │   0.024607 │          57641300.0 │ 316.07460299999997 │          5858.0 │ 24206.767144999998 │   0.17107 │       1792.0 │                │                   │           │            │       │
│ ada      │ 2017-10-03 │       604612406.44 │         125245327.846 │  1808.0 │    624650688.0 │   0.025757 │          16997800.0 │ 182.28098300000002 │          3701.0 │ 21063.743716900004 │   0.17107 │       1018.0 │                │                   │           │            │       │
└──────────┴────────────┴────────────────────┴───────────────────────┴─────────┴────────────────┴────────────┴─────────────────────┴────────────────────┴─────────────────┴────────────────────┴───────────┴──────────────┴────────────────┴───────────────────┴───────────┴────────────┴───────┘

2-й фрейм данных:

┌──────────┬────────────┬─────────────────────────────────┐
│ filename │    date    │ monthly percentage price change │
├──────────┼────────────┼─────────────────────────────────┤
│ ada      │ 2017-10-31 │                                 │
│ ada      │ 2017-11-30 │              2.3253932111955717 │
│ ada      │ 2017-12-31 │               5.768998209206785 │
│ ada      │ 2018-01-31 │            -0.17893930881865483 │
└──────────┴────────────┴─────────────────────────────────┘

Я хочу включить «столбец месячной цены в%» в конце консолидированного фрейма данных на основеключи: «имя файла» и «дата».Ниже приведен код, который я написал, чтобы добраться до этой точки.Я все еще новичок, поэтому заранее прошу прощения за мой плохо написанный код:

# get data file names
path =r'C:\Users\david\Documents\Crypto\Crypto_historical_data'
filenames = glob.glob(path + "/*.csv")

# Create a list called 'data':
data = []
# Include filename as a column in the dataframe
for csv in filenames:
    frame = pd.read_csv(csv)
    #frame['filename'] creates a new column named filename
    # os.path.basename() turns a path like /a/d/c.txt into the filename c.txt
    frame['filename'] = os.path.splitext(os.path.basename(csv))[0]
    data.append(frame)

# Load all data in to the dataframe
df = pd.concat(data, sort=False)

# Filter out any rows where price is blank
df1 = df.dropna(subset=['price(USD)'])
df1 = pd.DataFrame(data=df1)
df1 = df1.set_index(['filename', 'date'], inplace=False)

# You now have all prices sorted by date & by currency


# Exclude ctxc and ven as they are < 6 months old
df1 = df1.query('filename != ["ctxc", "ven"]')



# Get end of month prices
# Sets date as DateTime format:
df1 = df1.reset_index()
df1['date'] = pd.to_datetime(df1['date'])
# Sets date column as the index
# Groups data by each coin
# Converts daily to monthly prices, taking last price of the month
df2 = df1.set_index('date').groupby('filename').resample('M')['price(USD)'].last()


# Calculate monthly returns for each coin
df2 = df2.pct_change()
df2 = pd.DataFrame(data=df2)
df2 = df2.rename(columns = {'price(USD)':'monthly percentage price change'})


# Merge monthly returns in to df1

df3 = pd.merge(df1, df2, left_index=True, right_index=True,how='outer')

При попытке слияния я получаю сообщение об ошибке: «ValueError: невозможно объединиться без указания уровня и перекрывающихся имен»

Я надеюсь, что кто-нибудь подскажет мне наиболее эффективный способ добавления столбца ежемесячного процентного изменения в конце кадра данных, используя в качестве ключей «имя файла» и «дату», гарантируя, что я не будупотерять любые данные с 1-го кадра данных.Заранее спасибо всем, кто может мне помочь - я выдернул себе волосы из-за этого!

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

изменить

df3 = pd.merge(df1, df2, left_index=True, right_index=True,how='outer')

на

df3 = pd.merge(df1, df2, on=['filename','date'] ,how='outer')

0 голосов
/ 24 сентября 2018

Я думаю, вам, возможно, просто нужно сбросить индекс на df2.

Когда вы выполняете групповую работу, я полагаю, что это вернет фрейм данных с MultiIndex.Затем, когда вы идете к слиянию, у вас есть df1 с обычным целочисленным индексом и df2 с мультииндексом даты и имени файла.

Я думаю, что если вы сделаете эти две последние строки, это будет работать

df2 = df2.reset_index()
df3 = pd.merge(df1, df2, on=['date', 'filename'], how='outer')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...