Python:根据给定的索引,使用现有df中的行创建新的数据框

时间:2019-05-23 11:37:03

标签: python pandas

我有一个数据框,我需要创建一个新的数据框,当某行的某一列中的元素与另一行的元素相同时,第二次出现的行应直接移动到包含第一次出现的行的下方。恐怕这可能很难解释,但希望通过示例可以使它更清楚。

我有一个这样的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 ...

如果有人提出任何建议,我将不胜感激,我只是不知道该怎么办。我对编程很陌生,所以我认为解决问题的方式可能是错误的

1 个答案:

答案 0 :(得分:1)

如果我理解正确,排序的唯一关键是Direction列中的第一个元素。我假设Direction的类型为string。因此,看看这种实际上非常简单的天真的方法是否对您有用。

创建一个关键列(并非绝对必要,但需要澄清)

df['key'] = df['Direction'].apply(lambda x: x.split()[0])

然后在此key

上对值进行排序
df.sort_values('key')

这项工作吗?还是我错过了什么?