【问题标题】:Checking Previous elements in a list with Python and based on the previous element store a value in a new column with Pandas使用 Python 检查列表中的前一个元素,并基于前一个元素将值存储在 Pandas 的新列中
【发布时间】:2023-01-13 14:40:49
【问题描述】:
list_Crashes = ['Startup', 'Crash in A', 'Shutdown', 'Crash in B', 'Crash in C', 'Startup', 'Crash in D',
                'Startup', 'Crash in E', 'Crash in F', 'Crash in G', 'Shutdown', 'Crash in X', 'Crash in Y', 'Crash in Z']

我有一个包含 2 列的表。 该代码将检查列表的前一个元素并查找(启动/关闭): 示例:如果崩溃发生在启动之后; State 列将在 Crash 前面填充 Startup,如下表所示:

Crashes State
Crash in A Startup
Crash in B Shutdown
Crash in C Shutdown
Crash in D Startup
Crash in E Startup
Crash in F Startup
Crash in G Startup
Crash in X Shutdown
Crash in Y Shutdown
Crash in Z Shutdown

我面临的挑战是字母每次都是随机的,所以我必须在我的代码中使用“崩溃”而不是特定的字母!

关于如何执行此操作的任何建议?

编辑:现实生活中的例子(每一行都是列表的一个元素):

 12:33:04.1753    | Startup Configuration dazdazdazd
 12:35:15.0142    | Crash in A <546464>, thread 61
 12:35:53.0396    | Crash in B <5>, 3e9fc dazdazd
 12:35:54.1664    | Crash in C <70>,bfc690dasfff
 12:35:55.3817    | Crash in D <80>,de5484sdazdazd
 12:36:01.6642    | Crash in E <50>,bfc428fdsfsgdgsgsd
 12:53:34.6462    | System Shutdown
 12:53:48.1724    | Exception: Crash in Y <01>, 38310dazdazdafaga

@mozway 的答案中使用的代码:

def gen(lst):
    last_non_crash =''
    for x in lst:
        if  'Crash in' in x:
            last_non_crash = x
        else:
            yield [x, last_non_crash]
dataf = pd.DataFrame(gen(Crashtype), columns = ['Crashes', 'State'])

输出 :

                                            Crashes                                              State
0   12:53:34.6462    | [1230.490] System shutdown\n   12:36:01.6642    | Exception: Crash in E<50>,...

预期输出:

      Crashes     State
0  Crash in A   Startup
1  Crash in B   Startup
2  Crash in C   Startup
3  Crash in D   Startup
4  Crash in E   Startup
5  Crash in Y   Shutdown

【问题讨论】:

  • 我仍然不清楚您展示的示例列表如何将关闭关联到之前或之后的元素?例如,以下 sn-p 并不一定意味着 F 和 G 中的崩溃与启动相关联:[...启动,E 中的崩溃,F 中的崩溃,G 中的崩溃,关机,..]
  • 如果崩溃发生在关机之后; State 列将在 Crash 前填充 Shutdown

标签: python pandas


【解决方案1】:

IIUC,您可以使用生成器:

def gen(lst):
    last_non_crash = ''
    for x in lst:
        if not x.startswith('Crash in'):
            last_non_crash = x
        else:
            yield [x, last_non_crash]

        
pd.DataFrame(gen(list_Crashes), columns=['Crashes', 'State'])

输出:

      Crashes     State
0  Crash in A   Startup
1  Crash in B  Shutdown
2  Crash in C  Shutdown
3  Crash in D   Startup
4  Crash in E   Startup
5  Crash in F   Startup
6  Crash in G   Startup
7  Crash in X  Shutdown
8  Crash in Y  Shutdown
9  Crash in Z  Shutdown

输入:

list_Crashes = ['Startup', 'Crash in A', 'Shutdown', 'Crash in B', 'Crash in C', 'Startup', 'Crash in D',
                'Startup', 'Crash in E', 'Crash in F', 'Crash in G', 'Shutdown', 'Crash in X', 'Crash in Y', 'Crash in Z']
更新的答案
import re

def gen(lst):
    last_non_crash = ''
    for x in lst:
        m = re.search(r'(Crash in w+|Shutdown|Startup)', x)
        x = m.group() if m else 'unknown'
        if not 'Crash in' in x:
            last_non_crash = x
        else:
            yield [x, last_non_crash]

        
pd.DataFrame(gen(list_Crashes), columns=['Crashes', 'State'])

输出:

      Crashes     State
0  Crash in A   Startup
1  Crash in B   Startup
2  Crash in C   Startup
3  Crash in D   Startup
4  Crash in E   Startup
5  Crash in Y  Shutdown

【讨论】:

  • 另一个(尽管它是复杂的方法)是这样的:pd.Series(list_Crashes).str.extract('(?P&lt;crashes&gt;^Crash in.*)|(?P&lt;state&gt;.*)').assign(state=lambda v: v.state.ffill()).dropna(subset=['crashes'])
  • @mozway,谢谢你的回答,我看到你用过 startswith() 。是否可以改用 contains() ?因为它并不总是以“Crash in”开头,但可以保证“Crash in”将是 Crash 名称之前的字符串。
  • @Jon 有趣的方法;)
  • 对于“有趣”的一些定义:p
  • @mozway 工作得很好!谢谢你。
【解决方案2】:
def function1(x):
    return ' '.join(x[x.index('Crash'):x.index('Crash')+3]) if 'Crash' in x else ''

col2=df1.col2.str.split(' ')
Startup=col2.map(lambda x:'Startup' in x)
Shutdown=col2.map(lambda x:'Shutdown' in x)
Crash=np.where(Startup|Shutdown,False,col2.map(function1))
df1.assign(Crash=Crash).assign(State=np.select([Startup,Shutdown],['Startup','Shutdown'],None)).ffill()
    .loc[Crash!=False]

出去:

 Crashes     State
0  Crash in A   Startup
1  Crash in B   Startup
2  Crash in C   Startup
3  Crash in D   Startup
4  Crash in E   Startup
5  Crash in Y  Shutdown

【讨论】:

    猜你喜欢
    • 2022-11-13
    • 2022-01-06
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多