如何更改行中第二个副本的值

时间:2016-06-01 05:59:32

标签: python pandas

我无法在线找到以下答案。非常感谢您的宝贵帮助。

我有DataFrame这样的20k行:

ID            Date           Country
2008-0001     2008-01-02     India
2008-0001     2008-01-02     France
2008-0002     2008-01-03     USA

我想将ID中的所有重复内容(如第1行和第2行)中的所有重复内容,然后将第二个ID增加到破折号后的最高数字。

因此,例如因为已经2008-0002(假设0002是该年度该列中的破折号之后的最高数字),​​那么我想增加到一个以上的那个,所以其中一个重复的id值2008-0001将成为2008-0003。

我可以使用以下代码识别并删除重复项

drop_duplicate_df = train_df.drop_duplicates(['ID']) 

但这不是我需要的。

2 个答案:

答案 0 :(得分:0)

以下内容适用于示例数据,并假设您拥有多年的数据,您希望根据相同的逻辑重新标记数据:

df.Date = pd.to_datetime(df.Date) # to datetime to extract years
years = df.groupby(df.Date.dt.year) # analysis per year
new_df = pd.DataFrame()
for year, data in years:
    data.loc[data.duplicated(subset='ID'), 'ID'] = '{0}-{1}'.format(year, str(int(df.ID.max().split('-')[1]) + 1).zfill(4))
    new_df = pd.concat([new_df, data])

得到:

          ID       Date Country
0  2008-0001 2008-01-02   India
1  2008-0003 2008-01-02  France
2  2008-0002 2008-01-03     USA

答案 1 :(得分:0)

我相信这会完成它:

isdup = df.duplicated(subset=['ID1', 'ID2'])

dups, uniques = df[isdup], df[~isdup]

ids = ['ID1', 'ID2']
for i, row in dups.iterrows():
    while (row[ids] == uniques[ids]).all(axis=1).any():
        row.loc['ID2'] += 1
    uniques = uniques.append(row)

id1 = uniques.ID1.astype(str)
id2 = uniques.ID2.astype(str).str.zfill(4)
uniques.loc[:, 'ID'] = id1 + '-' + id1

uniques.drop(['ID1', 'ID2'], axis=1, inplace=True)

print uniques.sort_index()

          ID        Date Country
0  2008-0001  2008-01-02   India
1  2008-0003  2008-01-02  France
2  2008-0002  2008-01-03     USA