【问题标题】:How could i push the values to instead nan in pandas?我如何将值推到熊猫中的 nan ?
【发布时间】: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 值移动到前列,如下所示:

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以使用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
    

    【讨论】:

    • @ltdong7788 似乎是您的问题和您的例外不匹配
    【解决方案2】:
    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
    

    【讨论】:

    • 你的回答也很完美。但是很抱歉我没有很好地表达我的问题。
    【解决方案3】:

    如果您想保留与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
    

    【讨论】:

      猜你喜欢
      • 2020-05-07
      • 1970-01-01
      • 2014-09-22
      • 2019-02-13
      • 2018-08-24
      • 2019-04-24
      • 2018-07-05
      • 1970-01-01
      相关资源
      最近更新 更多