尝试基于多索引在熊猫中合并2个数据框

时间:2018-09-24 11:36:49

标签: pandas dataframe merge

我正在尝试合并2个数据框,当前,当我希望将其作为附加列添加时,第二个数据框的值将附加在第一个数据框的底部。

第一个数据帧

┌──────────┬────────────┬────────────────────┬───────────────────────┬─────────┬────────────────┬────────────┬─────────────────────┬────────────────────┬─────────────────┬────────────────────┬───────────┬──────────────┬────────────────┬───────────────────┬───────────┬────────────┬───────┐
│ 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 │                │                   │           │            │       │
└──────────┴────────────┴────────────────────┴───────────────────────┴─────────┴────────────────┴────────────┴─────────────────────┴────────────────────┴─────────────────┴────────────────────┴───────────┴──────────────┴────────────────┴───────────────────┴───────────┴────────────┴───────┘

第二个数据帧:

┌──────────┬────────────┬─────────────────────────────────┐
│ 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:无法在未指定级别且名称没有重叠的情况下加入”

我希望有人可以告诉我最有效的方法,即使用“文件名”和“日期”作为键,在数据框的末尾添加每月百分比变化列,以确保我不会丢失任何数据从第一个数据帧开始在此先感谢任何可以帮助我的人-我一直为此而努力!

2 个答案:

答案 0 :(得分:0)

我认为您可能只需要重置df2上的索引即可。

当您进行分组时,我相信它将返回一个具有MultiIndex的数据框。然后,当您进行合并时,您有df1和一个常规的整数索引,还有df2和一个具有日期和文件名的MultiIndex。

我认为如果您将这些作为最后两行,它将起作用

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

答案 1 :(得分:0)

更改

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

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