我有一个数据框,如下所示:
id | time
1 | 10:21
1 | 10:22
1 | 10:23
2 | 10:40
2 | 10:45
2 | 10:50
我想添加一个新列,如下所示:
id | time | new_time
1 | 10:21 | 10:22
1 | 10:22 | 10:23
1 | 10:23 | None
2 | 10:40 | 10:45
2 | 10:45 | 10:50
2 | 10:50 | None
这意味着,我想通过匹配id
列中的值来创建新列。例如,如果连续两行的id
值相同,那么我想从第二行的new_time
值开始将time
的值添加到第一列中柱。如果id
的值不同,那么我想为None
的值添加new_time
。如何使用python或pandas实现此目的?
答案 0 :(得分:4)
使用.shift()获取下一条记录:
df['new_time'] = df.shift(-1).time
结果:
id time new_time
0 1 10:21 10:22
1 1 10:22 10:23
2 1 10:23 10:40
3 2 10:40 10:45
4 2 10:45 10:50
5 2 10:50 NaN
然后将np.NaN
分配给每个ID的最后一行
df.loc[df.groupby('id', as_index= False).nth([-1]).index, 'new_time'] = np.NaN
结果:
id time new_time
0 1 10:21 10:22
1 1 10:22 10:23
2 1 10:23 NaN
3 2 10:40 10:45
4 2 10:45 10:50
5 2 10:50 NaN
答案 1 :(得分:2)
假设ID当前是索引,我会尝试:
flist = glob.glob('/**/Money_*_*.csv', recursive=True)
if len(set(flist)) == len(flist):
print('No Duplicate')
else:
print('Duplicate Found')
如果它不是索引,则可以跳过df = df.reset_index()
shifted = df.shift(-1)
df['new_time'] = shifted.time
df.loc[df.id != shifted.id, "new_time"] = None
df = df.set_index("id")
和reset_index
行。
基本上,它会移动整个数据帧,将它们匹配在一起,并且当ID不再相同时,会将这些值设置为“无”。