python - 使用熊猫按条件分组数据
问题描述
我有一个条目数据框'Indata2',我必须根据'Indata ['标签']'对其数据进行分组,生成一个名为'Indicator'的新列,我已经有了它,我应该做的是更正最后一列a小的 。
import pandas as pd
indata2 = [[2, 'SIS X+', 9.65, 'Q'],
[2, 'SIS X-', 5.32, 'Q'],
[2, 'SIS Y+', 8.24, 'Q'],
[2, 'SIS Y-', 3.27, 'Q'],
[2, 'SIS', 3.40, 'Q'],
[2, 'C. VIV', 0.23, 'L'],
[2, 'SOBRE P', 0.38, 'SD'],
[2, 'SOBRE P', 0.19, 'SD'],
[2, 'VIEN X+', 7.36, 'W'],
[2, 'VIEN X-', 23.09, 'W'],
[2, 'VIEN Y+', 6.66, 'W'],
[2, 'VIEN Y-', 2.68, 'W'],
[4, 'SIS X+', 14.41, 'Q'],
[4, 'SIS X-', 12.23, 'Q'],
[4, 'SIS Y+', 10.00, 'Q'],
[4, 'SIS Y-', 11.00, 'Q'],
[4, 'C. VIV', 0.38, 'L'],
[4, 'C. VIV', 0.34, 'L'],
[4, 'C. VIV', 0.13, 'L'],
[4, 'SOBRE P', 0.62, 'SD'],
[4, 'VIEN X+', 29.21, 'W'],
[4, 'VIEN X-', 8.70, 'W'],
[4, 'VIEN Y-', 7.46, 'W'],
[4, 'VIEN Y+', 11.62, 'W'],
[4, 'VIEN', 9.6, 'W']]
indata2 = pd.DataFrame(data = indata2, columns = ['KeyData', 'Text', 'AvgAbs', 'Label'])
l = indata2.Label.unique()
m = pd.DataFrame(l, columns = ['Label'])
m['Indicator'] = m.index + 1
outputdata = indata2.merge(m[['Indicator','Label']],'left')
# Correct outputdata['Indicator']
为了更正,我在“标签”中有 2 个特殊标签:“W”和“Q”。
您可以意识到,对于他们每个人都有一个文本:对于 Q:[SIS X +,SIS X-,SIS Y +,SIS Y-] 和对于 W:[VIEN X +,VIEN X-,VIEN Y +,维也纳Y-] 。所有这些数据都已转换为大写。
然后,对于新列'Indicator':在'Text'列中包含至少一个字母'X'的所有'W'值必须有一个指示符,并且当包含'Text'列时至少有一个字母'Y'其他指标,这是为了区分它们。
注意:如果“TEXT”列中没有“X”或“Y”,则“指标”=0。
结果(输出数据)应该是:
KeyData Text AvgAbs Label Indicator
2 SIS X+ 9.65 Q 1.1
2 SIS X- 5.32 Q 1.1
2 SIS Y+ 8.24 Q 1.2
2 SIS Y- 3.27 Q 1.2
2 SIS 3.40 Q 0
2 C. VIV 0.23 L 2
2 SOBRE P 0.38 SD 3
2 SOBRE P 0.19 SD 3
2 VIEN X+ 7.36 W 4.1
2 VIEN X- 23.09 W 4.1
2 VIEN Y+ 6.66 W 4.2
2 VIEN Y- 2.68 W 4.2
4 SIS X+ 14.41 Q 1.1
4 SIS X- 12.23 Q 1.1
4 SIS Y+ 10.00 Q 1.2
4 SIS Y- 11.00 Q 1.2
4 C. VIV 0.38 L 2
4 C. VIV 0.34 L 2
4 C. VIV 0.13 L 2
4 SOBRE P 0.62 SD 3
4 VIEN X+ 29.21 W 4.1
4 VIEN X- 8.70 W 4.1
4 VIEN Y- 7.46 W 4.2
4 VIEN Y+ 11.62 W 4.2
4 VIEN 9.60 W 0
解决方案
尝试使用map
和numpy.select
:
mapper = {label: i+1 for i, label in enumerate(indata2["Label"].unique())}
indata2["Indicator"] = np.select([(indata2["Label"]=="Q")&(indata2["Text"].str.contains("X")),
(indata2["Label"]=="Q")&(indata2["Text"].str.contains("Y")),
(indata2["Label"]=="W")&(indata2["Text"].str.contains("X")),
(indata2["Label"]=="W")&(indata2["Text"].str.contains("Y")),
(indata2["Label"].isin(list("QW"))&~(indata2["Text"].str.contains("[X-Y]", regex=True)))
],
[mapper["Q"]+0.1, mapper["Q"]+0.2, mapper["W"]+0.1, mapper["W"]+0.2, 0],
indata2["Label"].map(mapper))
>>> indata2
KeyData Text AvgAbs Label Indicator
0 2 SIS X+ 9.65 Q 1.1
1 2 SIS X- 5.32 Q 1.1
2 2 SIS Y+ 8.24 Q 1.2
3 2 SIS Y- 3.27 Q 1.2
4 2 SIS 3.40 Q 0.0
5 2 C. VIV 0.23 L 2.0
6 2 SOBRE P 0.38 SD 3.0
7 2 SOBRE P 0.19 SD 3.0
8 2 VIEN X+ 7.36 W 4.1
9 2 VIEN X- 23.09 W 4.1
10 2 VIEN Y+ 6.66 W 4.2
11 2 VIEN Y- 2.68 W 4.2
12 4 SIS X+ 14.41 Q 1.1
13 4 SIS X- 12.23 Q 1.1
14 4 SIS Y+ 10.00 Q 1.2
15 4 SIS Y- 11.00 Q 1.2
16 4 C. VIV 0.38 L 2.0
17 4 C. VIV 0.34 L 2.0
18 4 C. VIV 0.13 L 2.0
19 4 SOBRE P 0.62 SD 3.0
20 4 VIEN X+ 29.21 W 4.1
21 4 VIEN X- 8.70 W 4.1
22 4 VIEN Y- 7.46 W 4.2
23 4 VIEN Y+ 11.62 W 4.2
24 4 VIEN 9.60 W 0.0
推荐阅读
- python - 减少创建 BeautifulSoup 对象时的开销
- amazon-aurora - Postgres (AWS Aurora) 未强制执行唯一索引/约束
- java - 如何删除重复项?
- javascript - twitter api 流用户的主页时间线
- c++ - 在构造 std::variant 时禁用从指针类型到 bool 的隐式转换的最佳方法是什么?
- flutter - 如何从异步源构建元素并在 Flutter 中的后续调用中更新它们?
- python - 了解 SHA 256
- python - 如何编写断言语句来测试 ValueError
- python - 我正在尝试查找位图图像的高度和宽度,我环顾了网络,但没有找到任何答案
- android - 如何使 Mapbox Marker 可点击并获取其属性?