下面是一个数据框,其中包含列表形式的值。我想执行两项操作。我想删除所有包含year为['2017','2018]的行,并想将['2017']行和['2018']行拆分为单独的数据框。
df4 =pd.DataFrame({ 'Key':['12', '180,146','34', '56', '87'], 'Year':[ ['2017', '2018'],['2017'], ['2018'], ['2017','2018'],['2018']]})
当值本身在列表中时,我找不到可以执行此操作的选项。如果我可以将值保留在列表本身中会很好,因为其余的计算都基于它们。感谢帮助。
答案 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}