繁体   English   中英

如何在 python 中更有效地编写以下代码?

[英]How can I write the following code in a more efficient way in python?

从一个文件中,我解析了我需要的字段并将它们存储在变量中,它看起来像下面这样:

field_list = ['some_value','some_other_value']
raw_data = """sring1|0|2|N.S.|3|
sring2|0|2|N.S.|2|
sring3|0|2|3|5|"""

现在我需要创建一个 df,它看起来像:

      Str           Measure   Value
0  sring1        some_value  N.S.
1  sring1  some_other_value     3
2  sring2        some_value  N.S.
3  sring2  some_other_value     2
4  sring3        some_value     3
5  sring3  some_other_value     5

这里的逻辑如下:

例如,对于raw_data中的行“sring1|0|2|NS|3|” Str Column 的值为sring1Measure Column 的值为some_value (来自field_list ), Value Column 的值为N.S

现在,对于同一个字符串, Str Column 的值将是sring1Measure Column 的值将是some_other_valueValue Column 的值将是3

|2| 在字符串“sring1|0|2|NS|3|”中告诉我们会有多少行,最后两行是field_list的值

目前我有以下代码:

field_list = ['some_value','some_other_value']

db_columns = ['Str','Measure','Value']

raw_data = """sring1|0|2|N.S.|3|
sring2|0|2|N.S.|2|
sring3|0|2|3|5|"""

entry_list = raw_data.splitlines()
final_db_list =[]
for entries in entry_list:
    each_entry_list = entries.split('|')
    security = each_entry_list[0].strip()
    print(each_entry_list)
    no_of_fields = int(each_entry_list[2])
    db_list=[]
    upload_list=[]
    for i in range (0,no_of_fields):
        field = field_list[i]
        value = each_entry_list[3+i]
        db_list=[security,field,value]
        upload_list.append(db_list)
    final_db_list.append(upload_list)
flatList = [ item for elem in final_db_list for item in elem]

df = DataFrame(flatList,columns=db_columns)
print(df)

有人可以用更好的方法帮助我吗? 我有的那个可以用,但是太乱了。 需要对它进行一些 Python 化处理,但我没有主意了。 请帮忙!

我们可以这样做:

import pandas as  pd
from io import StringIO

field_list = ['some_value','some_other_value']
raw_data = """sring1|0|2|N.S.|3|
sring2|0|2|N.S.|2|
sring3|0|2|3|5|"""

df = pd.read_csv(StringIO(raw_data), sep='|', header=None)

df = df.drop(5, axis=1)

df = (df.set_index([0,1,2])
        .set_axis(field_list, axis=1)
        .reset_index(level=[1,2], drop=True)
        .stack()
        .rename('Value')
        .rename_axis(['Str', 'Measure'])
        .reset_index()
      )

print(df)

Output:

      Str           Measure Value
0  sring1        some_value  N.S.
1  sring1  some_other_value     3
2  sring2        some_value  N.S.
3  sring2  some_other_value     2
4  sring3        some_value     3
5  sring3  some_other_value     5

暂无
暂无

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

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