为何pd.cut会生成NaN值?附代码示例与输出差异
为什么pd.cut生成的Bin列全是NaN?
核心原因
你的代码里存在两个关键问题,直接导致Bin列全为NaN:
- 数值与分箱区间完全不重叠:待分箱的序列
s是[0,1,2,3,4,5],但你指定的分箱区间是[105,110)、[110,115)、[115,120)、[120,125)、[125,130]。所有数值都落在这些区间之外,而pd.cut默认会把任何不属于指定区间的值标记为NaN。 - 逻辑匹配错误:你试图将
s的分箱结果和Frequency列表绑定,但两者的逻辑对应关系不成立——s的每个元素对应一个分箱结果,而不是每个分箱对应一个Frequency值。
修正方案
根据你的需求,有两种常见的修正方向:
方向1:给s的数值设置匹配的分箱区间
如果你的目标是对s里的0-5进行分箱,需要调整分箱区间到该数值范围内:
import pandas as pd import numpy as np s = pd.Series(np.arange(6)) # 设置适配0-5的分箱区间 df = pd.DataFrame({'Bin': pd.cut(s, [0, 2, 4, 6]), 'Frequency': [2,5,6,8,8,1]}) print(df)
输出中Bin列会根据s的数值匹配对应的区间,不再是NaN。
方向2:直接将分箱区间与Frequency绑定
如果你的目标是展示分箱区间和对应的频率值,不需要依赖s的分箱结果,直接构造分箱区间即可:
import pandas as pd import numpy as np # 创建分箱区间(注意和Frequency的长度匹配,这里补一个区间适配6个Frequency值) bins = pd.IntervalIndex.from_tuples([(105,110), (110,115), (115,120), (120,125), (125,130), (130,135)]) df = pd.DataFrame({'Bin': bins, 'Frequency': [2,5,6,8,8,1]}) print(df)
这样Bin列会直接显示你需要的分箱区间,和Frequency一一对应。
内容的提问来源于stack exchange,提问作者Jimmy3421
相关产品推荐
相关产品推荐

