注意:这是一个玩具示例,有望说明我正在努力实现的目标。
我有一个字符串列表,我将其分为两个子列表,以便对其执行不同的预处理步骤
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