如何过滤或删除包含熊猫列表中值的行
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 中的行?