如何根据python另一列中的值移动单元格?

时间:2019-02-25 15:41:29

标签: python pandas

我有一个数据框,如下所示:

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实现此目的?

2 个答案:

答案 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不再相同时,会将这些值设置为“无”。