重塑数据框年份变量

时间:2017-09-07 15:58:51

标签: pandas dataframe

我如何重塑/变换:

df = pd.DataFrame({'Year':[2014,2015,2014,2015],'KS4':[True, True, False, False], 'KS5':[False, False, True, False]})

     KS4    KS5  Year
0   True  False  2014
1   True  False  2015
2  False   True  2014
3  False  False  2015

获得:

    KS4   KS5
0  2014  2014
1  2015      

4 个答案:

答案 0 :(得分:2)

试试这个

df.KS4=df.KS4.mul(df.Year)
df.KS5=df.KS5.mul(df.Year)

df.set_index('Year').stack().to_frame().replace({0:np.nan}).dropna()\
           .unstack().fillna('').reset_index(drop=True)
Out[159]: 
        0      
      KS4   KS5
0    2014  2014
1    2015

使用df.columns = df.columns.droplevel()

编辑删除列级别

df=df.set_index('Year').stack().to_frame().replace({0:np.nan}).dropna()\
           .unstack().fillna('')
df.mul(df.index.values).reset_index(drop=True)

Out[183]: 
      0      
    KS4   KS5
0  2014  2015
1  2014      

答案 1 :(得分:2)

看起来您只看到值为True的位置。如果是的话......

dd = dd.groupby(['Year'], as_index=False).sum()

dd.KS4 = dd.KS4 * dd.Year
dd.KS5 = dd.KS5 * dd.Year

dd.replace(0, '', inplace=True)

答案 2 :(得分:2)

有几个简单的答案涉及使用Series重构DataFrame。

df.iloc[:, :-1].apply(lambda x: pd.Series(df.Year.values[x]))

使用循环更明确地做同样的事情。

pd.DataFrame({col: pd.Series(df['Year'].values[df[col]]) for col in df.columns[:-1]})

    KS4     KS5
0  2014  2014.0
1  2015     NaN

答案 3 :(得分:1)

f = lambda d: d.mul(d.index.to_series().astype(str), 0)
df.groupby('Year').any().pipe(f).reset_index(drop=True)

    KS4   KS5
0  2014  2014
1  2015