python - Pandas:标记另一列标志之间的值

标签 python pandas data-science

工作流程如下:

  1. 然后按 LineNum 分组
  2. 将 LWS 列中大于 50 的值标记为“开始”
  3. 将文本列中包含“:”(冒号)的值标记为“结束”
  4. 在“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/

相关文章:

python - 比使用大数据集申请更快的方式来完成这个 Pandas 工作?

python - 将一系列字符串转换为日期时间对象以提取月份和年份

python - 尝试合并不同 Excel 文件中的列

python - 如何计算两列之间的模糊比?

python - 如何忽略列表中的高偏差

python - 我如何告诉 Python sys.argv 在 Unicode 中?

python - matplotlib:如何在给定的一组半径处绘制同心圆

python - 使用同一 Dataframe 中另一列的 int 作为索引获取列中的列表值

python - 我的群图中的色调有什么问题?

python - 无法根据 Pandas 数据框中的条件为值添加前缀