工作流程如下:
- 然后按 LineNum 分组
- 将 LWS 列中大于 50 的值标记为“开始”
- 将文本列中包含“:”(冒号)的值标记为“结束”
- 在“ExpectedFlag”中将开始和结束之间的值标记为 1
我已完成第 3 步,即名为“end”的列
我无法弄清楚如何像 ExpectedFlag 中那样标记开始和结束之间的值。有什么方法可以使用 pandas 操作来标记它吗?
text LWS LineNum start end ExpectedFlag
0 somethin 3 2 0 0 0
1 somethin 3 2 0 0 0
2 somethin 2 2 0 0 0
3 value 70 2 1 0 1
4 value 3 2 0 0 1
5 value: 3 2 0 1 1
6 val1 200 3 1 0 1
7 val1: 3 3 0 1 1
8 val2 3 3 0 0 0
9 val2 100 3 1 0 1
10 val2: 3 3 0 1 1
11 djsal 3 3 0 0 0
12 jdsal 3 3 0 0 0
13 ajsd 3 3 0 0 0
最佳答案
关于start
之间的填充值和end
,这可以根据this answer如下完成:
数据:
df = pd.DataFrame([[0,0],[0,0],[0,0],[1,0],[0,0],[0,1],[0,0],[0,0],[1,0],[0,1],[0,0],[0,0],[0,0],[0,0],[1,0],[0,0],[0,0],[0,1],[0,0],[0,0],[0,0],],columns=['start','end'])
start end
0 0 0
1 0 0
2 0 0
3 1 0
4 0 0
5 0 1
6 0 0
7 0 0
8 1 0
9 0 1
10 0 0
获取 start
的索引和end
:
s = df.start.nonzero()[0]
e = df.end.nonzero()[0]
>>> s, e
(array([3, 8], dtype=int64), array([5, 9], dtype=int64))
reshape 原始索引:
>>> index = df.index.values.reshape(-1,1)
array([[ 0],
[ 1],
[ 2],
[ 3],
[ 4],
[ 5],
[ 6],
[ 7],
[ 8],
[ 9],
[10]], dtype=int64)
然后我们可以利用numpy的broadcasting :
>>> index < [1] >>> index < [1,2,3,4,5]
array([[ True], array([[ True, True, True, True, True],
[False], [False, True, True, True, True],
[False], [False, False, True, True, True],
[False], [False, False, False, True, True],
[False], [False, False, False, False, True],
[False], [False, False, False, False, False],
[False], [False, False, False, False, False],
[False], [False, False, False, False, False],
[False], [False, False, False, False, False],
[False], [False, False, False, False, False],
[False]]) [False, False, False, False, False]])
对于每个 start
-end
对生成条件:
>>> ((s <= index) & (index <= e))
array([[False, False],
[False, False],
[False, False],
[ True, False],
[ True, False],
[ True, False],
[False, False],
[False, False],
[False, True],
[False, True],
[False, False]])
然后使用sum
:
df['Expected Flag'] = ((s <= index) & (index <= e)).sum(axis=1)
start end Expected Flag
0 0 0 0
1 0 0 0
2 0 0 0
3 1 0 1
4 0 0 1
5 0 1 1
6 0 0 0
7 0 0 0
8 1 0 1
9 0 1 1
10 0 0 0
单行:
((df.start.nonzero()[0] <= df.index.values.reshape(-1,1)) & (df.index.values.reshape(-1,1) <= df.end.nonzero()[0])).sum(axis=1)
关于python - Pandas:标记另一列标志之间的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52388933/