Python 尝试在pandas中删除行时出错

Python 尝试在pandas中删除行时出错,python,pandas,Python,Pandas,我有以下数据帧: fin_data[fin_data['Ticker']=='DNMR'] high low open close volume adj_close Ticker CUMLOGRET_1 PCTRET_1 CUMPCTRET_1 OBV EMA_5 EMA_10 EMA_20 VWMA_15 BBL_20_2.0 BBM_20_2.0 BBU_20_2.0 RSI_14

我有以下数据帧:

fin_data[fin_data['Ticker']=='DNMR']

            high        low        open        close       volume   adj_close   Ticker  CUMLOGRET_1 PCTRET_1    CUMPCTRET_1 OBV EMA_5   EMA_10  EMA_20  VWMA_15 BBL_20_2.0  BBM_20_2.0  BBU_20_2.0  RSI_14  PVT MACD_10_20_9    MACDh_10_20_9   MACDs_10_20_9   VOLUME_SMA_10   NAV Status  Premium_over_NAV
date                                                                                                            
2020-05-28  4.700000    4.700000    4.700000    4.700000    100.0   4.700000    DNMR    NaN NaN NaN 100.0   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10  Completed   -0.530
2020-05-29  4.700000    4.700000    4.700000    4.700000    0.0     4.700000    DNMR    0.000000    0.000000    0.000000    100.0   NaN NaN NaN NaN NaN NaN NaN NaN 0.000000e+00    NaN NaN NaN NaN 10  Completed   -0.530
2020-06-01  9.660000    9.630000    9.630000    9.660000    2000.0  9.660000    DNMR    0.720431    1.055319    1.055319    2100.0  NaN NaN NaN NaN NaN NaN NaN 100.000000  2.110638e+05    NaN NaN NaN NaN 10  Completed   -0.034
2020-06-02  9.660000    9.650000    9.650000    9.660000    60020   9.660000    DNMR    0.720431    0.000000    1.055319    2100.0  NaN NaN NaN NaN NaN NaN NaN 100.000000  2.110638e+05    NaN NaN NaN NaN 10  Completed   -0.034
2020-06-03  9.720000    9.630000    9.720000    9.630000    1100.0  9.630000    DNMR    0.717321    -0.003106   1.052214    1000.0  7.670000    NaN NaN NaN NaN NaN NaN 99.303423   2.107222e+05    NaN NaN NaN NaN 10  Completed   -0.037
我想把收盘价为4.70的前两行去掉,或者把4.70换成9.66

为了删除行,我尝试了以下操作,但出现了一个错误:

fin_data.drop(fin_data[fin_data['Ticker']=='DNMR'],axis=0,inplace=True)
KeyError: "['high' 'low' 'open' 'close' 'volume' 'adj_close' 'Ticker' 'CUMLOGRET_1'\n 'PCTRET_1' 'CUMPCTRET_1' 'OBV' 'EMA_5' 'EMA_10' 'EMA_20' 'VWMA_15'\n 'BBL_20_2.0' 'BBM_20_2.0' 'BBU_20_2.0' 'RSI_14' 'PVT' 'MACD_10_20_9'\n 'MACDh_10_20_9' 'MACDs_10_20_9' 'VOLUME_SMA_10' 'NAV' 'Status'\n 'Premium_over_NAV'] not found in axis"
然后我尝试替换4.70的值,但即使代码执行时没有错误,数据帧也没有改变

fin_data.loc[fin_data['Ticker']=='DNMR','adj_close'][0:2] = 9.66
请注意,我不想删除数据库中其他股票的这两个日期(2020-05-28和2020-5-29)的数据,只想删除这一个(“DNMR”)


谢谢。

您用错了,要删除有问题的行(或实际选择相反的行),您应该这样做

fin_data = fin_data[(find_data['Ticker'] == 'DNMR']) & (fin_data['close'] == 4.7)]

要指出您的drop问题,请执行以下操作:

drop()方法需要“删除单个标签或类似列表的索引或列标签”(single label或list-like-Index或column-label),这样就可以了(注意子集后面的.Index)

但是,如果您将日期作为索引,并且有多行具有相同的日期,那么您也会删除这些行


解决方案是将索引重置为整数。。但是(尽管我不明白为什么您需要非唯一索引),这可能不是您想要的,您应该坚持Jimmar的答案:)

使用掩码通常比较简单

  • 价值观更新
  • 行数下降
日期 高的 低的 打开 关 体积 调整关闭 2020-05-28 00:00:00 4.7 4.7 4.7 0 100 4.7 2020-05-29 00:00:00 4.7 4.7 4.7 0 0 4.7 2020-06-01 00:00:00 9.66 9.63 9.63 9.66 2000 9.66 2020-06-02 00:00:00 9.66 9.65 9.65 9.66 60020 9.66 2020-06-03 00:00:00 9.72 9.63 9.72 9.63 1100 9.63
一个简单的
fin_数据[(fin_数据['Ticker']!='DNMR'])|(fin_数据['close']!=4.7)]
就足够了吗?谢谢,罗布。您的rows drop函数是否也会删除数据库中具有相同日期的其他行?否-查看掩码,它是ticker和close的值。我运行与您完全相同的代码,掩码不会捕获这两行。遮罩只会产生一系列假布尔值。我不明白为什么,因为您的代码非常有意义,而且正如您所演示的那样,它是有效的。我的熊猫版里会有什么吗?或者我的索引、列的结构?这正是掩码的含义。。。针对包含/排除索引的True/False表示掩码捕获的前两行不是True,其他行不是False。谢谢,Jimmar。我想应该是吧=4.7而不是==4.7。我尝试了这个解决方案,但这两行仍保留在新的数据框中。
df
    a   b  c   d
0  10   8  3   5
1   5   5  3   1
2   2   2  8   6

df.drop(df[df["a"]== 10].index, axis= 0, inplace= True)
df
   a   b  c   d
1  5   5  3   1
2  2   2  8   6
import pandas as pd
import io
fin_data = pd.read_csv(io.StringIO("""date            high        low        open        close       volume   adj_close   Ticker  CUMLOGRET_1 PCTRET_1    CUMPCTRET_1 OBV EMA_5   EMA_10  EMA_20  VWMA_15 BBL_20_2.0  BBM_20_2.0  BBU_20_2.0  RSI_14  PVT MACD_10_20_9    MACDh_10_20_9   MACDs_10_20_9   VOLUME_SMA_10   NAV Status  Premium_over_NAV
                                                                                                            
2020-05-28  4.700000    4.700000    4.700000    4.700000    100.0   4.700000    DNMR    NaN NaN NaN 100.0   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10  Completed   -0.530
2020-05-29  4.700000    4.700000    4.700000    4.700000    0.0     4.700000    DNMR    0.000000    0.000000    0.000000    100.0   NaN NaN NaN NaN NaN NaN NaN NaN 0.000000e+00    NaN NaN NaN NaN 10  Completed   -0.530
2020-06-01  9.660000    9.630000    9.630000    9.660000    2000.0  9.660000    DNMR    0.720431    1.055319    1.055319    2100.0  NaN NaN NaN NaN NaN NaN NaN 100.000000  2.110638e+05    NaN NaN NaN NaN 10  Completed   -0.034
2020-06-02  9.660000    9.650000    9.650000    9.660000    60020   9.660000    DNMR    0.720431    0.000000    1.055319    2100.0  NaN NaN NaN NaN NaN NaN NaN 100.000000  2.110638e+05    NaN NaN NaN NaN 10  Completed   -0.034
2020-06-03  9.720000    9.630000    9.720000    9.630000    1100.0  9.630000    DNMR    0.717321    -0.003106   1.052214    1000.0  7.670000    NaN NaN NaN NaN NaN NaN 99.303423   2.107222e+05    NaN NaN NaN NaN 10  Completed   -0.037"""), sep="\s+")

fin_data.date=pd.to_datetime(fin_data.date)
fin_data = fin_data.set_index(["date"])

mask = fin_data["Ticker"].eq("DNMR") & fin_data["close"].eq(4.7)
fin_data.loc[mask, "close"] = 0
print(fin_data.iloc[:,0:6].to_markdown())