【问题标题】:Error operating data with pandas (in case of missing data)使用 pandas 操作数据时出错(以防数据丢失)
【发布时间】:2021-10-27 20:16:37
【问题描述】:

我有 DataFrame 'indata2'。以下代码允许我添加一个“指标”列,该列根据 Indata2['Label'] 对我的数据进行分组。

import pandas as pd
import numpy as np

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')

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['Label'] 列中,我有两个特殊标签:W 和 Q,它们根据 indata2['Label'] 和 indata2['Text'] 进行分组。

一切都很好,但是在 indata2['Label'] 中没有输入 Q、W 或两个标签的情况下会发生错误(这可能会发生,因为它们是数据)。发生这种情况时,我会遇到类型错误:键错误。

注意:代码的注释行适用于未输入 Q、W 或两个标签的情况,在这种情况下它会给我错误。但是当我取消注释它们时效果很好。

对于这种情况可以给出什么解决方案?问候。

【问题讨论】:

  • 当一个或另一个标签不存在时,您希望发生什么?您是否希望它按另一个仍然>插入值?没有更具体的回应?您可以使用if 逻辑、try: except 或其他检查,但如果您能解释得更清楚一点会有所帮助

标签: python python-3.x pandas numpy


【解决方案1】:

确保映射器始终具有 Q 和 W 的值,即使您不需要它们:

mapper = {"Q": 1, "W": 2}
mapper.update({label: i+2 for i, label in enumerate(indata2[~indata2["Label"].isin(["Q","W"])]["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         4   SIS X+   14.41     Q        1.1
9         4   SIS X-   12.23     Q        1.1
10        4   SIS Y+   10.00     Q        1.2
11        4   SIS Y-   11.00     Q        1.2
12        4   C. VIV    0.38     L        2.0
13        4   C. VIV    0.34     L        2.0
14        4   C. VIV    0.13     L        2.0
15        4  SOBRE P    0.62    SD        3.0

顺便说一句,您不需要以下任何行(并且应该从您的代码中删除它们):

l = indata2.Label.unique()
m = pd.DataFrame(l, columns = ['Label'])
m['Indicator'] = m.index + 1

outputdata = indata2.merge(m[['Indicator','Label']],'left')

【讨论】:

    猜你喜欢
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 2018-05-04
    相关资源
    最近更新 更多