如何过滤或删除包含熊猫列表中值的行

Posted

技术标签:

【中文标题】如何过滤或删除包含熊猫列表中值的行【英文标题】: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']])

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何过滤或删除包含熊猫列表中值的行的主要内容,如果未能解决你的问题,请参考以下文章

如何使用熊猫从另一个数据框 B 的列中删除包含特定数量值的数据框 A 中的行?

Python Pandas:如何从包含列表中值的数据框中删除所有列?

从另一个数据框中删除包含相同日期的行-python-大熊猫

如何从包含前两列组合的熊猫数据框中删除行

如何删除hive数组中值为0的元素

如何从包含特定列中特定字符串的熊猫数据框中删除行? [复制]