我有一个数据框,我需要创建一个新的数据框,当某行的某一列中的元素与另一行的元素相同时,第二次出现的行应直接移动到包含第一次出现的行的下方。恐怕这可能很难解释,但希望通过示例可以使它更清楚。
我有一个这样的df :(重要的一栏是“方向”)
Node | Feature | Indicator | Value | Class | Direction
--------------------------------------------------------
1 | WPS | <= | 0.27 | 4 | 1 -> 2
--------------------------------------------------------
2 | ABC | <= | 0.40 | 5 | 2 -> 3
--------------------------------------------------------
3 | CXC | <= | 0.45 | 2 | 3 -> 4
--------------------------------------------------------
4 | WPS | <= | 0.56 | 1 | 1 -> 5
--------------------------------------------------------
5 | ABC | <= | 0.30 | 3 | 2 -> 5
--------------------------------------------------------
6 | CXC | <= | 0.55 | 5 | 3 -> 1
当方向上的第一个数字出现两次时(对于节点(1&4),(2&5)和(3&6)),我希望出现第二个方向的行(节点4、5和6)直接移到另一行下方。
我需要结果看起来像这样:
Node | Feature | Indicator | Value | Class | Direction
--------------------------------------------------------
1 | WPS | <= | 0.27 | 4 | 1 -> 2
--------------------------------------------------------
4 | WPS | <= | 0.56 | 1 | 1 -> 5
--------------------------------------------------------
2 | ABC | <= | 0.40 | 5 | 2 -> 3
--------------------------------------------------------
5 | ABC | <= | 0.30 | 3 | 2 -> 5
--------------------------------------------------------
3 | CXC | <= | 0.45 | 3 | 3 -> 4
--------------------------------------------------------
6 | CXC | <= | 0.55 | 5 | 3 -> 1
我花了很长时间试图提出一个解决方案,所以如果有人能够提供帮助,我将非常感激。
此刻我要做什么:
创建一个包含['Direction']列中前整数的列表: first_Ints_ls = [1、2、3、1、2、3]
然后我尝试在first_Ints_ls中找到第一个事件和第二个事件的索引,我希望该索引可用于通过索引访问数据框的行。
first_ind_ls = []
second_ind_ls = []
for i in firstInt_ls:
# Find the indexes of the first and second occurance
first_ind = firstInt_ls.index(i, 0)
second_ind = firstInt_ls.index(i, first_ind+1)
first_ind_ls.append(first_ind)
second_ind_ls.append(second_ind)
这将产生:
print(first_ind_ls)
>> [1, 2, 3, 1, 2, 3]
print(second_ind_ls)
>> [4, 5, 6]
我从first_ind_ls中删除所有重复项,以便两个列表的大小相同。
# Resulting lists:
>> [1, 2, 3]
>> [4, 5, 6]
现在,我想遍历Dataframe并在first_ind_ls(为1)的第一个索引处获取行,然后添加到新的数据帧,然后在second_ind_ls(4的)第一索引处获取行。 )并将其添加到新的数据框中。继续直到我得到上面的数据框。
我已经尝试过的东西根本无法正常工作,因此除非有要求,否则我不会打扰发布代码。
我真的很难弄清楚如何遍历df并访问行,同时遍历包含索引的两个列表,然后在每个索引处将行添加到新的df ... >
如果有人提出任何建议,我将不胜感激,我只是不知道该怎么办。我对编程很陌生,所以我认为解决问题的方式可能是错误的
答案 0 :(得分:1)
如果我理解正确,排序的唯一关键是Direction
列中的第一个元素。我假设Direction
的类型为string
。因此,看看这种实际上非常简单的天真的方法是否对您有用。
创建一个关键列(并非绝对必要,但需要澄清)
df['key'] = df['Direction'].apply(lambda x: x.split()[0])
然后在此key
df.sort_values('key')
这项工作吗?还是我错过了什么?