Python 从数据框中删除方括号和撇号

Python 从数据框中删除方括号和撇号,python,pandas,dataframe,Python,Pandas,Dataframe,我是一名外科医生,正在尝试分析一些患者数据。我有一个患者数据框(271x15),这些患者进行了多次手术。这是来自单个操作的更大(4010x71)数据帧,使用@Arne的大量帮助。基本上(见下文) )使用数据透视表,然后查找多个(>=2)操作。这太棒了。我感兴趣的是前两次手术以及两次手术之间的天数,以确定植入手术的持续时间。 数据框头部位于此处,显示植入物插入和移除的患者ID和代码(V011和V014) OPERTN_01

我是一名外科医生,正在尝试分析一些患者数据。我有一个患者数据框(271x15),这些患者进行了多次手术。这是来自单个操作的更大(4010x71)数据帧,使用@Arne的大量帮助。基本上(见下文) )使用数据透视表,然后查找多个(>=2)操作。这太棒了。我感兴趣的是前两次手术以及两次手术之间的天数,以确定植入手术的持续时间。 数据框头部位于此处,显示植入物插入和移除的患者ID和代码(V011和V014)

                                 OPERTN_01      OPDATE_01
ID      
11                              [V011, V014]    [2016-06-21, 2017-02-27]
13                              [V011, V014]    [2016-07-14, 2016-01-14]
14                              [V014, V011]    [2014-02-25, 2014-07-01]
15                              [V014, V011]    [2014-06-26, 2015-04-16]
我希望把两次手术的日期减去

  • 删除方括号
  • 将?元组拆分为两列
  • 确保日期
    pd.datetime
  • 减去两个日期
  • 我一直在拆支架。我尝试过替换
    df.replace(“[”,”)
    ,这对数据帧或系列
    OPERTN\u 01
    没有影响。理想情况下,我希望在整个数据帧中删除方括号,而不是逐列删除

    在这个数据框架中产生的列表(感谢@Arne)产生了非常好的描述性统计数据,但对我来说很难操作


    我还有一个问题,OPDATE_01中的日期没有排序,因此日期之间的差异通常为负值。这可能是因为我想在其中一个时间做太多的事情。

    您是否正在寻找类似的内容:

    from io import StringIO
    import ast
    import pandas as pd
    
    # ------ create sample data ------
    s = """ID;OPERTN_01;OPDATE_01
    11;["V011", "V014"];["2016-06-21", "2017-02-27"]
    13;["V011", "V014"];["2016-07-14", "2016-01-14"]
    14;["V014", "V011"];["2014-02-25", "2014-07-01"]
    15;["V014", "V011"];["2014-06-26", "2015-04-16"]"""
    
    df = pd.read_csv(StringIO(s), sep=';')
    df['OPERTN_01'] = df['OPERTN_01'].apply(ast.literal_eval)
    df['OPDATE_01'] = df['OPDATE_01'].apply(ast.literal_eval)
    df = df.set_index('ID')
    
    # ------ end sample data ------
    
    # list comprehension to sort and convert str to datetime
    df['OPDATE_01'] = [sorted([pd.to_datetime(x[0]), pd.to_datetime(x[1])]) for x in df['OPDATE_01']]
    
    # if your values in the list are already datetime then ignore what is above and do
    # df['OPDATE_01'] = df['OPDATE_01'].apply(sorted)
    
    # apply pd.Series to explode your list into columns and then rename col if you want
    date = df['OPDATE_01'].apply(pd.Series).rename(columns={0:'OPDATE_01_0', 1:'OPDATE_01_1'})
    # calculate the difference between dates
    date.diff(axis=1)
    
       OPDATE_01_0 OPDATE_01_1
    ID                        
    11         NaT    251 days
    13         NaT    182 days
    14         NaT    126 days
    15         NaT    294 days
    
    或 根据你的评论 v011v014 v014v011
    这两个操作都非常棒,-需要我花一段时间来完成,但非常清楚,并教会了我很多东西。非常好,很高兴它能帮助我。如果您需要进一步解释pandas/python操作,请告诉我。我正在努力筛选结果列表。我想创建有序操作的新数据帧
    [V011,V014]
    和``[V014,V011]
    。我尝试过
    df_植入物['OPDATE_01'].str.findall('V011,V014]````,和
    df_植入物['OPERTN_01'].str.contains('V011,V014',regex=True)
    -都没有找到任何结果(NaN的布尔值)。当记录包含列表时,是否有方法进行过滤?@capnahab最简单的方法是将列表列转换为字符串,然后使用。因此,首先将
    OPERTN_01
    转换为类似So
    s=df_imports['OPERTN_01']的字符串。应用(str)
    然后使用布尔索引:
    df_imports[(s==“['V011',V014']”)(s==“['V014',V011']”]
    @capnahab或者听起来你想分别过滤
    [V011,V014]
    [V014,V011]
    ,这样你就可以做
    v011v014=df_植入物[(s==“['V011',V014']”]
    ,然后
    v014v011=df_植入物[(s==“['V014”,“V011'])
    # list comprehension to sort and convert list to datetime
    df['OPDATE_01'] = [sorted([pd.to_datetime(x[0]), pd.to_datetime(x[1])]) for x in df['OPDATE_01']]
    
    # if your values in the list are already datetime then ignore what is above and do
    # df['OPDATE_01'] = df['OPDATE_01'].apply(sorted)
    
    # apply pd.Series to explode your list into columns and then rename col if you want
    date = df['OPDATE_01'].apply(pd.Series).rename(columns={0:'OPDATE_01_0', 1:'OPDATE_01_1'})
    # merge two frames on ID to maintain all columns
    m = df['OPERTN_01'].to_frame().merge(date, left_index=True, right_index=True)
    # calc diff and assign to new column
    m['diff'] = m.diff(axis=1)['OPDATE_01_1']
    
           OPERTN_01 OPDATE_01_0 OPDATE_01_1     diff
    ID                                               
    11  [V011, V014]  2016-06-21  2017-02-27 251 days
    13  [V011, V014]  2016-01-14  2016-07-14 182 days
    14  [V014, V011]  2014-02-25  2014-07-01 126 days
    15  [V014, V011]  2014-06-26  2015-04-16 294 days
    
    # just changing variable name to match your comment
    df_implants = m
    
    # convert OPERTN_01 to a string
    s = df_implants['OPERTN_01'].apply(str)
    
    # boolean indexing to filter df_implants where OPERTN_01 is equal to ['V011', 'V014']
    v011v014 = df_implants[(s == "['V011', 'V014']")]
    
    # boolean indexing to filter df_implants where OPERTN_01 is equal to ['V014', 'V011']
    v014v011 = df_implants[(s == "['V014', 'V011']")]
    
           OPERTN_01 OPDATE_01_0 OPDATE_01_1     diff
    ID                                               
    11  [V011, V014]  2016-06-21  2017-02-27 251 days
    13  [V011, V014]  2016-01-14  2016-07-14 182 days
    
           OPERTN_01 OPDATE_01_0 OPDATE_01_1     diff
    ID                                               
    14  [V014, V011]  2014-02-25  2014-07-01 126 days
    15  [V014, V011]  2014-06-26  2015-04-16 294 days