我如何重塑/变换:
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
答案 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