我有資料幀'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 或兩個標簽的情況,在這種情況下會出現錯誤。但是當我取消注釋它們時效果很好。
對于這種情況可以給出什么解決方案?你好。
uj5u.com熱心網友回復:
確保映射器始終具有 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')
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/339472.html
