【问题标题】:Populating pandas dataframe by searching data in substring of string in a list通过在列表中的字符串子字符串中搜索数据来填充熊猫数据框
【发布时间】:2020-05-22 16:55:56
【问题描述】:

假设一个字符串列表:

lst1 = ['A1 B1 C1', 'A2 B2 D1', 'S1 M1 A3', 'A4 B3 G1','H1 K1 W1']

我想通过在每个字符串中搜索特定值(如果可用)来创建一个表,然后填充一个 pandas 数据框。

像这样:

         '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 很陌生,所以我仍在学习字符串操作以及搜索和查找。我确信必须有更好的方法来做到这一点。当我尝试将它们放入数据框中时,我的解决方案无法正常工作,因为相同的值会不断填充在我的数据框中。但是当我这样做时:

        if stuff.startswith('A'):
           print(stuff)

循环运行良好,我得到不同的“A”、“B”、“C”、“D”值。 例如:(我不想这样)

         '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

【问题讨论】:

    标签: python python-3.x regex string pandas


    【解决方案1】:

    这是一种方法:

    import pandas as pd
    
    lst1 = ['A1 B1 C1', 'A2 B2 D1', 'S1 M1 A3', 'A4 B3 G1','H1 K1 W1']
    
    cols = ['A', 'B', 'C', 'D']   ### cols for each string
    df = pd.DataFrame(columns=cols)
    
    ### Populating values
    for elt in lst1:
        new = {}
        for sub_elt in elt.split(" "):
            if sub_elt[0] in cols:
                new[sub_elt[0]] = sub_elt
        df = df.append(pd.Series(new), ignore_index=True)
    

    如有不清楚的地方欢迎提问

    【讨论】:

    • 谢谢。虽然当我应用它时,我的实际数据得到了在线回溯: if sub_elt[0] in cols: IndexError: string index out of range。我的数据正是这种格式,所以我无法弄清楚这个错误背后的原因
    • 没有数据很难判断。也许您在第一个元素之前有一个尾随空格?
    • 我以为就是这样。但是我尝试用数据来测试我的理论,但得到了同样的错误。您能否解释一下如果 cols: 中的 sub_elt[0] 本质上是做什么的?
    猜你喜欢
    • 2018-02-04
    • 1970-01-01
    • 2019-03-04
    • 2021-01-28
    • 2018-04-26
    • 2022-10-13
    • 2018-06-28
    • 2019-01-07
    • 2016-07-30
    相关资源
    最近更新 更多