繁体   English   中英

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

[英]Restoring original order of python list after processing?

注意:这是一个玩具示例,希望能说明我想要实现的目标。

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

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
--------------------------

我不能依靠字符串本身的内容来通知它的 position (所以按字母顺序排序已经出局了)。 我只能依靠它原来的position在列表中。 我希望在我合并两个子列表后,我可以创建一个可以排序的索引。

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

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

我将首先将列表更改为具有值及其顺序的内容。 它可以是自动添加索引的 dataframe,也可以是内置位置的列表。

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

与其拆分您的列表,不如创建一个 function 来返回您想要放入 dataframe 的内容。 在你的例子中,这就像

 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后使用myslist 在这种情况下,您甚至可以屏蔽部分列以更快地应用不同类型的处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM