处理后恢复python列表的原始顺序



注意:这是一个玩具示例,有望说明我正在努力实现的目标。

我有一个字符串列表,我将其分为两个子列表,以便对其执行不同的预处理步骤

mylist = ['a1','a','a2','b','b2','b3','c','c1','c2']

为了简单起见,我想在每个元素的开头添加一个特定的子字符串,这取决于该元素是否包含数字(实际上,我有多个预处理步骤,需要拆分原始列表(:

import re
withNum = [[i,'numPresent_'+i] for i in mylist if re.compile(r'd').search(i)]
noNum = [[i,'noNum_'+i] for i in mylist if not re.compile(r'd').search(i)]

既然我有了两个子列表,我如何在数据框架中组合它们,使它们反映出它们的原始顺序?很明显,如果我使用df.append,它将简单地将一个堆栈在另一个之上。。。

df = pd.DataFrame().append(withNum).append(noNum)

返回:

-------------------------
0              1
-------------------------
a1         numPresent_a1
a2         numPresent_a2
b2         numPresent_b2
b3         numPresent_b3
c1         numPresent_c1
c2         numPresent_c2
a          noNum_a
b          noNum_b
c          noNum_c
--------------------------

如何重新排序数据帧,使其反映原始列表的顺序?

预期结果:

-------------------------
0              1
-------------------------
a1         numPresent_a1
a          noNum_a
a2         numPresent_a2
b          noNum_b
b2         numPresent_b2
b3         numPresent_b3
c          noNum_c
c1         numPresent_c1
c2         numPresent_c2
--------------------------

我不能依赖字符串本身的内容来通知它的位置(所以按字母顺序排序是不可行的(。我只能依赖它在列表中的原始位置。我希望有一种方法,我可以创建一个索引,我可以排序后,我已经合并了两个子列表。

您可以如下修改您的列表理解:

test = [[i,'numPresent_'+i] if re.compile(r'd').search(i) else [i,'noNum_'+i] for i in mylist]
df = pd.DataFrame().append(test)

返回

0              1
0  a1  numPresent_a1
1   a        noNum_a
2  a2  numPresent_a2
3   b        noNum_b
4  b2  numPresent_b2
5  b3  numPresent_b3
6   c        noNum_c
7  c1  numPresent_c1
8  c2  numPresent_c2

试试这个:

df = df.set_index(0).loc[mylist].reset_index()

打印:

0              1
0  a1  numPresent_a1
1   a        noNum_a
2  a2  numPresent_a2
3   b        noNum_b
4  b2  numPresent_b2
5  b3  numPresent_b3
6   c        noNum_c
7  c1  numPresent_c1
8  c2  numPresent_c2

与其拆分列表,不如创建一个函数来返回要放入数据帧中的内容。在你的例子中,这有点像

def process(x):
prefix = 'numPresent_' if any(map(str.isdigit, x)) else 'noNum_'
return [i, prefix + i]

现在你可以在列表中制作你想要的任何东西:

pd.DataFrame([process(x) for x in mylist])

或者,您可以在从myslist创建一列数据帧后使用df.apply。在这种情况下,您甚至可以屏蔽列的部分,以更快地应用不同类型的处理。

我首先要将列表更改为具有值及其顺序的列表。它可以是自动添加索引的数据帧,也可以是一个内置了索引位置的列表

import pandas as pd
mylist = ['a1','a','a2','b','b2','b3','c','c1','c2']
newlist=[]
counter=0
for i in mylist:
counter+=1
newlist.append((counter,i))
newlist

另一种方法是使用else语句,而不是两个if语句。下面的代码是完整的并且有效。

mylist = ['a1','a','a2','b','b2','b3','c','c1','c2']
import re
nums=[]
for i in mylist:
counter+=1
if re.compile(r'd').search(i):
nums.append([i,'numPresent_'+i])
else: 
nums.append([i,'noNum_'+i])
df = pd.DataFrame(nums)
df

最新更新