Python 通过搜索列表中字符串子字符串中的数据填充dataframe
假设有一个字符串列表:Python 通过搜索列表中字符串子字符串中的数据填充dataframe,python,python-3.x,regex,string,pandas,Python,Python 3.x,Regex,String,Pandas,假设有一个字符串列表: lst1 = ['A1 B1 C1', 'A2 B2 D1', 'S1 M1 A3', 'A4 B3 G1','H1 K1 W1'] 我想通过搜索每个字符串中的特定值(如果可用)来创建一个表,然后填充一个数据框 像这样: 'A' 'B' 'C' 'D' string1 A1 B1 C1 Nan string2 A2 B2 Nan D1 string3 A3
lst1 = ['A1 B1 C1', 'A2 B2 D1', 'S1 M1 A3', 'A4 B3 G1','H1 K1 W1']
我想通过搜索每个字符串中的特定值(如果可用)来创建一个表,然后填充一个数据框
像这样:
'A' 'B' 'C' 'D'
string1 A1 B1 C1 Nan
string2 A2 B2 Nan D1
string3 A3 Nan Nan Nan
string4 A4 B3 Nan Nan
string5 Nan Nan Nan Nan
为了在每个字符串中进行搜索,我将每个字符串拆分为一个列表,使其成为嵌套列表,以便在每个字符串中运行for循环进行搜索。我的RegEx游戏不是很强大,但我认为这可以通过对RegEx的良好处理来实现
我当前的代码:
import pandas as pd
lst1 = ['A1 B1 C1', 'A2 B2 D1', 'S1 M1 A3', 'A4 B3 G1','H1 K1 W1']
modlst1 = []
for each in lst1:
modlst1.append(each.split())
rows = range(len(modlst1)) ### rows for each string
cols = ['A','B','C','D'] ### cols for each string
df = pd.DataFrame(index = rows, columns = cols)
df = df.fillna(0)
### Populating values
for each in rows:
for stuff in modlst1[each]:
if stuff.startswith('A'):
df['A'] = stuff
elif stuff.startswith('B'):
df['B'] = stuff
elif stuff.startswith('C'):
df['C'] = stuff
elif stuff.startswith('D'):
df['D'] = stuff
我对Python非常陌生,所以我仍在学习字符串操作和搜索与查找。我相信一定有更好的方法来做到这一点。我的解决方案不起作用,因为当我尝试将相同的值放入dataframe时,它们一直填充在我的dataframe中。但当我这样做的时候:
if stuff.startswith('A'):
print(stuff)
循环运行良好,我得到了不同的“A”、“B”、“C”、“D”值。
例如:(我不想要这个)
以下是一种方法:
将熊猫作为pd导入
lst1=['A1 B1 C1','A2 B2 D1','S1 M1 A3','A4 B3 G1','H1 K1 W1']
cols=['A','B','C','D']####每个字符串的cols
df=pd.DataFrame(columns=cols)
###填充值
对于lst1中的elt:
新={}
对于英语教学中的sub_elt,拆分(“”):
如果cols中的sub_elt[0]:
新建[sub_elt[0]]=sub_elt
df=df.append(pd.Series(新),ignore_index=True)
如果某些部分不清楚,请随时询问谢谢。虽然当我将其应用于实际数据时,我在cols:indexer:string索引超出范围的行:if sub_elt[0]上得到了回溯。我的数据正是这种格式,所以我无法找出这个错误背后的原因,没有数据很难判断。也许在第一个元素之前有一个尾随空格?我想应该是它。但我试图用数据来检验我的理论,但却得到了同样的错误。你能解释一下,如果cols中的sub_elt[0]实际上是在做什么吗?
'A' 'B' 'C' 'D'
string1 A1 B1 C1 Nan
string2 A1 B1 C1 D1
string3 A1 B1 C1 D1
string4 A1 B1 C1 D1
string5 A1 B1 C1 D1