首页 > 解决方案 > 使用熊猫按条件分组数据

问题描述

我有一个条目数据框'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

标签: pythonpython-3.xpandasdataframe

解决方案


尝试使用mapnumpy.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

推荐阅读