Pandas如何使用标签切割多列数据?

3
我想对多个列的数值进行切割和标记。基本上是这样的:
df[numericColumn] = pd.cut(df[numericColumn], 3, labels=["small", "medium", "big"])

我发现这份代码(可以正常运行),但它并没有进行我想要的标记,当我使用“labelling”替换“bin”时,它会报错并说我需要包含一个“bin”。
df = pd.DataFrame(np.random.rand(10,4))
df.apply(pd.cut, bins=[0,0.5,1])

有没有办法在pandas中对多个列进行标签切割?
1个回答

3

因此,我们来分解一下,看看发生了什么。您会发现可以设置容器,然后逐行切割,然后将切割结果更改为您想要使用的类别名称。

# set up a dataframe
df = pd.DataFrame(np.random.rand(10,4))
df.columns = ['col1','col2','col3','col4']

# set up the intervals
bins = pd.IntervalIndex.from_tuples([(0, 0.33), (0.33, 0.66), (0.66, 1)])

# do the cut on col1 for example
x = pd.cut(df["col1"].to_list(),bins)

# change the name of the catagories
x.categories = ['small','medium','large']
# put it back
df['col1'] = x

提供

    col1    col2        col3        col4
0   large   0.589432    0.545828    0.257144
1   medium  0.625025    0.087607    0.548300
2   small   0.538186    0.057027    0.023201
3   medium  0.686324    0.027694    0.819753
4   medium  0.850623    0.977317    0.782361
5   large   0.375888    0.209709    0.903763
6   medium  0.094957    0.583052    0.534926
7   large   0.101968    0.863916    0.929300
8   large   0.612073    0.005553    0.723863
9   large   0.814393    0.327281    0.463976

如果您想遍历整个数据框

# set up a dataframe
df = pd.DataFrame(np.random.rand(10,4))
df.columns = ['col1','col2','col3','col4']

# set up the intervals
bins = pd.IntervalIndex.from_tuples([(0, 0.33), (0.33, 0.66), (0.66, 1)])
names = ['small','medium','large']

for col in df.columns:
    x = pd.cut(df[col].to_list(),bins)
    x.categories = names
    df[col] = x

谢谢,保罗。这真的很酷。我有100多列,是否可以批量处理?或者遍历每一列? - Lostsoul
我添加了一个函数,可以通过列遍历数据框,你也可以编写一个函数并按列应用它。 - Paul Brennan
1
谢谢,我觉得很合理。但不知道为什么当我运行这个程序时,所有的数据都显示为NaN。我认为这可能与我的数据有关。 - Lostsoul
1
我觉得我找到了答案。我认为你的代码假设数据已经是百分比形式。我对数据进行了最小-最大缩放,并且现在似乎可以正常工作了。 - Lostsoul
1
万岁!我正在看那个可能是错的地方... - Paul Brennan
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接