应用这两个数据框时,数据框loc中出现错误

时间:2020-08-26 13:15:43

标签: python pandas dataframe loc

我正在尝试将这两个数据框(data2和交易)放在一起,使其看起来像这样https://i.stack.imgur.com/pR8bW.png

data2:

            Close
2015-08-28  113.290001
2015-08-31  112.760002
2015-09-01  107.720001
2015-09-02  112.339996
2015-09-03  110.370003
2015-09-04  109.269997
2015-09-08  112.309998
2015-09-09  110.150002
2015-09-10  112.570000
2015-09-11  114.209999

交易:

               Trades
2015-08-28     3.0
2015-08-31     3.0
2015-09-01     3.0
2015-09-02     3.0
2015-09-03     2.0

代码:

import matplotlib.pyplot as plt

fig = plt.figure()

ax1 = fig.add_subplot(111, ylabel='Portfolio value in $')

data2["Close"].plot(ax=ax1, lw=2.)

ax1.plot(data2.loc[trades.Trades == 2.0].index, data2.total[trades.Trades == 2.0],
         '^', markersize=10, color='m')
ax1.plot(data2.loc[trades.Trades == 3.0].index, 
         data2.total[trades.Trades == 3.0],
         'v', markersize=10, color='k')

plt.show()

但此错误仍在返回:


IndexingError Traceback(最近一次通话) 在()中 7个data2 [“ Close”]。plot(ax = ax1,lw = 2。) 8 ----> 9 ax1.plot(data2.loc [trades.Trades == 2.0] .index,data2.total [trades.Trades == 2.0], 10'^',markersize = 10,颜色='m') 11 ax1.plot(data2.loc [trades.Trades == 3.0] .index,

3帧 在check_bool_indexer(index,key)中的/usr/local/lib/python3.6/dist-packages/pandas/core/indexing.py 2316如果mask.any(): (2317) -> 2318“不对齐的布尔系列提供为” 2319“ indexer(布尔系列的索引和” 2320“索引对象不匹配。”

IndexingError:作为索引器提供的不可对齐的布尔系列(布尔系列和被索引对象的索引不匹配)。

1 个答案:

答案 0 :(得分:1)

两个数据帧的索引不同。我采用了为 data2 数据帧定义 masks 的方法,该模板基于 trades 数据帧中的值,并且有效。

另外,您引用的示例代码 total 不存在。更新为使用 Close

import pandas as pd
import io
import matplotlib.pyplot as plt

data2 = pd.read_csv(io.StringIO("""            Close
2015-08-28  113.290001
2015-08-31  112.760002
2015-09-01  107.720001
2015-09-02  112.339996
2015-09-03  110.370003
2015-09-04  109.269997
2015-09-08  112.309998
2015-09-09  110.150002
2015-09-10  112.570000
2015-09-11  114.209999"""), sep="\s+")

trades = pd.read_csv(io.StringIO("""               Trades
2015-08-28     3.0
2015-08-31     3.0
2015-09-01     3.0
2015-09-02     3.0
2015-09-03     2.0"""), sep="\s+")

# make sure it's dates
data2 = data2.reset_index().assign(index=lambda x: pd.to_datetime(x["index"])).set_index("index")
trades = trades.reset_index().assign(index=lambda x: pd.to_datetime(x["index"])).set_index("index")

fig = plt.figure()
ax1 = fig.add_subplot(111, ylabel='Portfolio value in $')

data2["Close"].plot(ax=ax1, lw=2.)

mask2 = data2.index.isin((trades.Trades == 2.0).index)
mask3 = data2.index.isin((trades.Trades == 3.0).index)

ax1.plot(data2.loc[mask2].index, data2.Close[mask2],
         '^', markersize=10, color='m')
ax1.plot(data2.loc[mask3].index, 
         data2.Close[mask3],
         'v', markersize=10, color='k')


plt.show()

输出 enter image description here