Pandas df.drop()方法无法执行,但是可以吗?

时间:2019-07-22 19:31:24

标签: python pandas

如果行中的日期大于或等于80天,则尝试从csv_file中删除行。

这是CSV_FILE :(所有内容都已读取并设置为CSV_FILE中的字符串)

2019-05-01 | 14

2019-05-02 | 16

2019-05-03 | 2

2019-05-04 | 3

2019-05-05 | 3

2019-05-06 | 6

2019-05-07 | 14

2019-05-08 | 8

2019-05-09 | 5

2019-05-10 | 1

2019-05-11 | 5

2019-05-12 | 4

2019-05-13 | 1

2019-05-14 | 2

2019-05-15 | 3

2019-05-16 | 8

2019-05-17 | 2

2019-05-18 | 3

2019-05-19 | 4

2019-05-20 | 4

这是我尝试过的:

s = pd.Series(pd.to_datetime('today') - pd.to_datetime(df.index[0])).dt.days df[s.le(80)].reset_index(drop=True).to_csv(csv_file, index=False)

不起作用,因为我尝试做的pd.Series失败。我目前正在研究的是通过df.drop()进行尝试,但我无法弄清楚出了什么问题并抛出错误。

实现的逻辑可以工作,但是它会根据布尔逻辑的[0]索引返回KeyError: TrueKeyError: False的错误。

    df = pd.read_csv(GLOBAL_PATH + csv_file, sep=',', index_col=0, encoding='utf-8', low_memory=False)
    # print(df)
    df.drop(df[(pd.to_datetime('today') - pd.to_datetime(df.index[0])).days >= 82].index, inplace=True)

如果第一个索引中的日期大于或等于80天,我将尝试从csv_file永久删除行。

任何帮助表示赞赏!谢谢!

-编辑-

对于仍在寻找的任何人。伊恩·汤普森(Ian Thompson)确实回答了这个问题,这就是我正在做什么的最终代码(顶部工作代码)。我确实也包括了我为解决此问题而一直在努力的所有其他代码,以防将来对其他人有帮助。

def remove_old_data(csv_file):
    # WORKING CODE
    df = pd.read_csv(GLOBAL_PATH + csv_file, sep=',', index_col=0, encoding='utf-8', low_memory=False)
    # print(df)  # Before Removal
    df.drop(df.loc[(pd.to_datetime('today') - pd.to_datetime(df.index)).days >= 180].index, inplace=True)
    # print(df)  # After Removal

    # Appended to CSV_FILE
    df.to_csv(GLOBAL_PATH + csv_file)

    # TEST OUT CODE
    s1 = (pd.to_datetime('today') - pd.to_datetime(df.index)).days
    print(s1, type(s1))  # Int64Index([84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65],
                         # dtype='int64', name='date') <class 'pandas.core.indexes.numeric.Int64Index'>
    s2 = (pd.to_datetime('today') - pd.to_datetime(df.index[0])).days  # Calculate the date difference
    print(s2, type(s2))  # 82 <class 'int'>
    zeroindex = df.index[0]
    print(zeroindex, type(zeroindex))  # 2019-05-01 <class 'str'>
    datestamp = pd.to_datetime(df.index[0])
    print(datestamp, type(datestamp))  # 2019-05-01 00:00:00 <class 'pandas._libs.tslibs.timestamps.Timestamp'>
    print(df.loc[s1 <= 80])
    print(df.loc[(pd.to_datetime('today') - pd.to_datetime(df.index)).days <= 80])

    # TEST DROP CODE
    # df.drop(df[(pd.to_datetime('today') - pd.to_datetime(df.index[0])).days >= 82].index, inplace=True)
    # df.drop(df[df.iloc[[0]].le((pd.to_datetime('today') - pd.to_datetime(df.index[0])).days >= 90)].index, inplace=True)

    # NONE WORKING CODE / IN PROGRESS CODE
    # Just days time == (pd.to_datetime('today') - pd.to_datetime(df.index[0])).days
    # s = pd.Series(pd.to_datetime('today') - pd.to_datetime(df.index[0])).dt.days  # Calculate the date difference
    # print(s[0], type(s[0]), type(s))  # Result -- 57 <class 'numpy.int64'> <class 'pandas.core.series.Series'>
    # df[s.le(55)]#.reset_index(drop=True).to_csv(csv_file, index=False)
    # df2 = df.drop(axis=0, index=df.index[0], inplace=False).reset_index(drop=True).to_csv(csv_file, index=False)
    # df2 = df.loc[df.index[0]].le(40).reset_index(drop=False)#.to_csv(csv_file, index=False, header=False, sep=',')

1 个答案:

答案 0 :(得分:0)

在没有看到数据样本的情况下,很难诊断问题,但是我认为您可能在s的定义中引用的是单个元素,而不是整个索引/系列。这是一些示例数据。

# random seed
np.random.seed(1)

# random data with datetime index
df = pd.DataFrame(index=pd.date_range('20190501', periods=100), data=np.random.randint(0, 10, size=(100,10)))

# show head
print(df.head())

            0  1  2  3  4  5  6  7  8  9
2019-05-01  5  8  9  5  0  0  1  7  6  9
2019-05-02  2  4  5  2  4  2  4  7  7  9
2019-05-03  1  7  0  6  9  9  7  6  9  1
2019-05-04  0  1  8  8  3  9  8  7  3  6
2019-05-05  5  1  9  3  4  8  1  4  0  3

使用第一行代码会产生以下结果:

s = pd.Series(pd.to_datetime('today') - pd.to_datetime(df.index[0])).dt.days

print(s.head())

0    82
dtype: int64

如果您想过滤出大于或等于80的行,则应删除[0],以便拥有整个索引,而不是像这样的单行并且不转换为{{1} }:

pd.Series

然后您可以将其放入# I removed the [0], # the conversion to a series, # and the dt since it's not a series and therefore doesn't have the attribute s = pd.to_datetime('today') - pd.to_datetime(df.index)).days # s is now an index of integers print(s) Int64Index([ 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17], dtype='int64') 中进行过滤,并仅保留dfs(即不大于或等于< 80的行):

80