我有一個條目數據框'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',則 'indicator' = 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句