用特定索引替换另一个列表中的数据框值

时间:2020-10-08 23:53:57

标签: python python-3.x pandas dataframe data-science

我有一个具有列日期的数据框,我正尝试用基于索引的另一个列表替换,例如: rong_dates_indexes具有原始数据帧df中日期格式错误的索引列表:

dirty_dates_indexes=[4,33,48,54,59,91,95,132,160,175,180,197,203,206,229,237,266,271,278,294,298,333,348,373,380,420,442]

formated_dates=['2019-04-25','2019-12-01','2019-06-16','2019-10-07','2019-08-06','2019-02-17','2019-11-20','2019-03-10','2019-10-11','2019-03-04','2019-07-31','2019-10-12','2019-09-13','2019-08-26','2019-12-29','2019-10-11','2019-11-20','2019-06-16','2019-12-12','2019-03-22','2019-01-21','2019-03-21','2019-10-15','2019-12-01','2019-03-20','2019-09-08','2019-08-19']

我正在尝试将df中的所有值替换为索引中的 错误格式的索引,其值的格式为格式日期。

我尝试了以下代码,但是收到错误消息:

for index in dirty_dates_indexes:
    df.loc[index].date.replace(df.loc[index].date,formated_dates(f for f in range(0,len(range(formated_dates)))))

错误:

TypeError: 'list' object cannot be interpreted as an integer

如何解决?还是有更好的方法?

1 个答案:

答案 0 :(得分:0)

您正在尝试从dirty_dates_indexes获取值,并使用该值在formatted_dates中查找位置。可能会惹您生气。

您使用loc而不是iloc来到达特定行。

这就是我所做的。

dirty_dates_indexes=[4,33,48,54,
                     59,91,95,132,
                     160,175,180,197,
                     203,206,229,237,
                     266,271,278,294,
                     298,333,348,373,
                     380,420,442]
formated_dates=['2019-04-25','2019-12-01','2019-06-16','2019-10-07',
                '2019-08-06','2019-02-17','2019-11-20','2019-03-10',
                '2019-10-11','2019-03-04','2019-07-31','2019-10-12',
                '2019-09-13','2019-08-26','2019-12-29','2019-10-11',
                '2019-11-20','2019-06-16','2019-12-12','2019-03-22',
                '2019-01-21','2019-03-21','2019-10-15','2019-12-01',
                '2019-03-20','2019-09-08','2019-08-19']

import pandas as pd
df = pd.DataFrame()
df['dirty_dates'] = pd.date_range('2019-01-01', periods=500,freq='D')

for i,row_id in enumerate(dirty_dates_indexes):
    df.dirty_dates.iloc[row_id] = pd.to_datetime(formated_dates[i])


print (df.head(20))

结果如下:

   dirty_dates
0   2019-01-01
1   2019-01-02
2   2019-01-03
3   2019-01-04
4   2019-04-25  # <-- this row changed
5   2019-01-06
6   2019-01-07
7   2019-01-08
8   2019-01-09
9   2019-01-10
10  2019-01-11
11  2019-01-12
12  2019-01-13
13  2019-01-14
14  2019-01-15
15  2019-01-16
16  2019-01-17
17  2019-01-18
18  2019-01-19
19  2019-01-20