【问题标题】:Pandas add column from cuts to DataFramePandas 将剪切列添加到 DataFrame
【发布时间】:2017-06-04 16:09:09
【问题描述】:

我需要在DataFramecuts 上记录cuts(子箱)。

如果每个cut 的子bin 边界都相同,这非常简单。例如,

df = pd.DataFrame({'A':np.random.random(100), 'B':np.random.random(100)})
# Primary bins: quintiles on column A
df['P'] = pd.qcut(df['A'], 5, labels=range(1,6)).astype(int)
# Secondary bins: quartiles on column B
df['Q'] = df.groupby(['P'])['B'].transform(lambda x: pd.qcut(x, 4, labels=range(1,5)))

但是,当每个主要 cutcut 边界不同时,我不知道如何使用转换函数,甚至不知道如何将第二个 cut 值返回到 DataFrame 中。例如,

subBinBounds = [[0, .1, .5, 1],[0, .3, .6, 1],[0, .2, .7, 1],[0, .4, .6, 1][0, .2, .5, 1]]
for i in range(5):
    cut = df[df['P'] == i+1]  # P is in {1, 5}
    subbin = pd.cut(cut['B'], subBinBounds[i], labels=range(1,4))
    cut['Q'] = cut.assign(Q=subbin.values)
    # But how do we get 'Q' back into df?

【问题讨论】:

    标签: pandas dataframe lambda merge group-by


    【解决方案1】:

    您可以将concat subseries 附加到sers - list of Series 的循环中。

    #for testing - get same output of random functions
    np.random.seed(100)
    df = pd.DataFrame({'A':np.random.random(100), 'B':np.random.random(100)})
    # Primary bins: quintiles on column A
    df['P'] = pd.qcut(df['A'], 5, labels=range(1,6)).astype(int)
    
    sers = []
    subBinBounds = [[0, .1, .5, 1],[0, .3, .6, 1],[0, .2, .7, 1],[0, .4, .6, 1], [0, .2, .5, 1]]
    for i in range(5):
        cut = df[df['P'] == i+1]
        subbin = pd.cut(cut['B'], subBinBounds[i], labels=range(1,4))
        sers.append(subbin)
    
    df['Q'] = pd.concat(sers)
    print (df.head(10))
              A         B  P  Q
    0  0.543405  0.778289  3  3
    1  0.278369  0.779598  2  3
    2  0.424518  0.610328  3  2
    3  0.844776  0.309000  5  2
    4  0.004719  0.697735  1  3
    5  0.121569  0.859618  1  3
    6  0.670749  0.625324  4  3
    7  0.825853  0.982408  5  3
    8  0.136707  0.976500  1  3
    9  0.575093  0.166694  3  1
    

    【讨论】:

    • 嗯,我不知道有什么问题,但如果我使用range(1, 6),我会得到IndexError: list index out of range。对你来说效果很好?
    • 没错,你也可以使用range(5),查看编辑后的答案。
    • @feetwet - 谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 2020-12-28
    • 1970-01-01
    • 2020-03-04
    • 2018-07-27
    • 2021-08-13
    相关资源
    最近更新 更多