python - pandas :通过减少一个大系列的一系列系列
问题描述
我有一个 int 系列,比如这个:
ages = pd.DataFrame(np.array([100, 107,99,98,65,45,32,18,66,69, 74,83,81,67, 101, 94, 52,90]), columns=["age"])
我的目标是在一个数组中创建几个系列。每个系列应仅包含一个区间中的值。
例如,array_series[0] 将返回:
age
0 100
1 107
2 99
3 98
4 101
5 94
6 90
array_series[1] 将返回:
age
0 83
1 81
ETC...
我尝试过(但失败了)两个选项:
首先,for 循环中的 if/else 语句:
array_series = [] for step in range(90,60,-10): if ages["age"] >= step: # selection when the age is higher than 90, or between 80 and 90, 70 and 80 and 60 and 70 df_interval = ages[ages["age"] >= step] # then we add this Serie in the array array_series.append(df_interval) # finally we delete the values of the new Serie in the larger one to avoid duplicates ages = pd.concat([ages, df_interval, df_interval]).drop_duplicates(keep=False) else: # final Serie (age < 60) df_interval = ages[ages["age"] < step] array_series.append(df_interval)
长话短说:ValueError:一个系列的真值是模棱两可的。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。
于是我找了一个替代方案,发现 np.where(),看起来很优雅:
for step in range(90,60,-10): df_interval = np.where(ages["age"] >= step, ages[ages["age"] >= step], ages[ages["age"] < step]) array_series.append(df_interval)
长话短说,卷土重来:ValueError:操作数无法与形状一起广播 (16,) (6,1) (10,1)
我应该考虑什么其他选择?
编辑:数组有严格的间隔,如下所示:* array_series[0]:高于 90 的值 *array_series[1]:80 到 90 之间的值 *array_series[2]:70 到 80 之间的值 *array_series[3]:介于60 和 70 * array_series[4] :最后,低于 60 的值
解决方案
解决此问题的一种方法是pd.cut
and groupby()
:
bins = pd.cut(ages['age'], bins=range(0,100))
for r, d in ages.groupby(bins)['age']:
print(r)
print(d)
推荐阅读
- c++ - 在 C++ 中将十进制转换为十六进制
- postgresql - Postgres:在 JSON 数组上循环获取 where 子句
- r - 如何在 R 中使用 dplyr 计算不同的组
- javascript - 赛普拉斯 - 如何正确等待导入的 JS 函数的结果
- java - 使用 new 运算符创建了多少个字符串
- regex - 正则表达式:匹配特殊字符(|、-、/...)之前的第一次出现
- kubernetes - Azure-AKS 入口与负载均衡器错误上游过早关闭 websocket 连接上的连接
- reactjs - 如何在 React js 中创建一个包含天数列的表?
- c++ - 矢量行为怪异
- jetbrains-ide - GoLand IDE 不会索引文件