【发布时间】:2017-09-09 14:10:41
【问题描述】:
我使用以下代码设置了一个数据框:
df = pd.DataFrame({'A':['a','a','b','c'],'B':[123,456,555,888]})
然后我执行如下代码:
pd.pivot(df.A, df.index, df.B)
数据框变成这样:
现在我想知道如何将非 NAN 值移动到前列,如下所示:
【问题讨论】:
我使用以下代码设置了一个数据框:
df = pd.DataFrame({'A':['a','a','b','c'],'B':[123,456,555,888]})
然后我执行如下代码:
pd.pivot(df.A, df.index, df.B)
数据框变成这样:
现在我想知道如何将非 NAN 值移动到前列,如下所示:
【问题讨论】:
您可以使用groupby,而不是pivoting(然后修复结果):
In [321]: df = pd.DataFrame({'A':['a','a','b','c'],'B':[123,456,555,888]})
In [322]: df.groupby('A')['B'].apply(lambda x: pd.Series(x.values)).unstack()
Out[322]:
0 1
A
a 123.0 456.0
b 555.0 NaN
c 888.0 NaN
或者,或者,使用groupby/cumcount 为每个组分配正确的列号,
然后pivot:
In [325]: df.assign(C=df.groupby('A').cumcount()).pivot(index='A', columns='C', values='B')
Out[325]:
C 0 1
A
a 123.0 456.0
b 555.0 NaN
c 888.0 NaN
【讨论】:
df.apply(lambda x : x[x.notnull()].values.tolist(),1).apply(pd.Series)
Out[262]:
0 1
A
a 123.0 456.0
b 555.0 NaN
c 888.0 NaN
【讨论】:
如果您想保留与NaNs 相同数量的列
In [585]: dff = pd.pivot(df.A, df.index, df.B)
In [586]: (dff.apply(lambda x: pd.Series(x.dropna().values), axis=1)
.reindex_axis(dff.columns, 1))
Out[586]:
0 1 2 3
A
a 123.0 456.0 NaN NaN
b 555.0 NaN NaN NaN
c 888.0 NaN NaN NaN
如果你不需要
In [587]: dff.apply(lambda x: pd.Series(x.dropna().values), axis=1)
Out[587]:
0 1
A
a 123.0 456.0
b 555.0 NaN
c 888.0 NaN
【讨论】: