【问题标题】:How to filter or remove rows that contain values in list in pandas如何过滤或删除包含熊猫列表中值的行
【发布时间】:2019-03-07 20:00:36
【问题描述】:

下面是一个数据框,其中包含列表形式的值。我想执行两个操作。我想删除所有包含年份为 ['2017', '2018] 的行,并且我想将 ['2017'] 行和 ['2018'] 行拆分为单独的数据框。

df4 =pd.DataFrame({ 'Key':['12', '180,146','34', '56', '87'], 'Year':[ ['2017', '2018'],['2017'], ['2018'], ['2017','2018'],['2018']]})

当值本身位于列表中时,我找不到可以执行此操作的选项。如果我可以将值保留在列表本身中会很好,因为其余的计算都是基于它们的。感谢帮助。

【问题讨论】:

    标签: python python-3.x pandas list dataframe


    【解决方案1】:

    首先使用 str.len 获取要保留的行

    df1=df4[df4.Year.str.len().eq(1)].copy()
    

    然后,使用groupby 将数据框拆分为dict

    d={x : y for x , y in df1.groupby(df1.Year.apply(tuple))}
    d
    Out[680]: 
    {('2017',):        Key    Year
     1  180,146  [2017], ('2018',):   Key    Year
     2  34  [2018]
     4  87  [2018]}
    

    【讨论】:

      【解决方案2】:

      您可以为每个条件创建掩码:

      m_2017_2018 = df4['Year'].apply(lambda x: x == ['2017', '2018'])
      m_2017 = df4['Year'].apply(lambda x: x == ['2017'])
      m_2018 = df4['Year'].apply(lambda x: x == ['2018'])
      

      然后为每个掩码创建 DataFrame。

      df4 = df4[~m_2017_2018]
      df_2017 = df4[m_2017]
      df_2018 = df4[m_2018]
      

      【讨论】:

      • 这非常适合我的要求。谢谢!
      【解决方案3】:

      我建议您将 Year 作为整数存储在结果中。这是一种方法:

      df = df4.loc[df4['Year'].map(len).eq(1)]\
              .assign(Year=np.array(df['Year'].values.tolist()).ravel().astype(int))
      
      dfs = dict(tuple(df.groupby('Year')))
      
      print(dfs)
      
      {2017:        Key  Year
             1  180,146  2017,
      
       2018:        Key  Year
             2       34  2018
             4       87  2018}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-04
        • 1970-01-01
        • 2023-02-02
        • 1970-01-01
        • 2016-09-09
        • 1970-01-01
        • 1970-01-01
        • 2021-11-18
        相关资源
        最近更新 更多