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

时间:2018-10-02 16:31:17

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

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

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

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

3 个答案:

答案 0 :(得分: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]}

答案 1 :(得分:1)

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

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]

答案 2 :(得分:1)

我建议您将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}