Pandas 将剪切列添加到 DataFrame
Posted
技术标签:
【中文标题】Pandas 将剪切列添加到 DataFrame【英文标题】:Pandas add column from cuts to DataFrame 【发布时间】:2017-06-04 16:09:09 【问题描述】:我需要在DataFrame
的cut
s 上记录cut
s(子箱)。
如果每个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)))
但是,当每个主要 cut
的 cut
边界不同时,我不知道如何使用转换函数,甚至不知道如何将第二个 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?
【问题讨论】:
【参考方案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 - 谢谢。以上是关于Pandas 将剪切列添加到 DataFrame的主要内容,如果未能解决你的问题,请参考以下文章
使用 else if 逻辑将条件列添加到 Pandas 数据框 - Python