我无法在线找到以下答案。非常感谢您的宝贵帮助。
我有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'])
但这不是我需要的。
答案 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