【问题标题】:How to write the values to another column of dataframe based on Row_id column and value exist in match column?如何根据 Row_id 列将值写入数据框的另一列并且匹配列中存在值?
【发布时间】:2022-01-24 05:55:37
【问题描述】:

我有一个像这样的数据框,其中包含 ROW_IDMatches 列。根据 Matches 列中每一行的值,我应该在 Result 列中写入。例如,在第一行,我们有 ; ALL MATCH -3,所以在新列Result中,这个; ALL MATCH 应该出现在 ROW_ID 3. 在第 8 个 ROW_ID 中,我们有 ;全场比赛-9;差异在# -10。所以在我们的 Result; ALL MATCH 应出现在 ROW_ID 9 和 中; Diff in# 应该存在于 ROW_ID 10

ROW_ID Matches
1 ; ALL MATCH -3
2
3
4
5 ; ALL MATCH -6
6
7
8 ; ALL MATCH -9; Diff in# -10
9
10

也就是说最终的dataframe应该是这样的。

ROW_ID Result
1
2
3 ; ALL MATCH
4
5
6 ; ALL MATCH
7
8
9 ; ALL MATCH
10 ; Diff in#

我尝试了很多,我使用 dataframe.iterrows() 分别提取了每一行的 int 值和其他部分。但我无法将该值打印到特定位置。 df.at[] 方法不起作用。 loc 和 iloc 我也试过了,但没有得到如何将该字符串打印到该列的特定行。

【问题讨论】:

  • 这是您最复杂的案例吗?除了空的或以“; ALL MATCH”开头的元素之外,你可以有其他元素吗?其他栏目?等等

标签: python python-3.x pandas string dataframe


【解决方案1】:

试试:

df['Result'] = df['ROW_ID'].map(
    df['Matches'].str.extractall('(; [^-]+) -(\d+)')
                 .astype({1: int}).set_index(1).squeeze()
).fillna('')

输出:

>>> df
   ROW_ID                       Matches       Result
0       1                ; ALL MATCH -3             
1       2                                           
2       3                                ; ALL MATCH
3       4                                           
4       5                ; ALL MATCH -6             
5       6                                ; ALL MATCH
6       7                                           
7       8  ; ALL MATCH -9; Diff in# -10             
8       9                                ; ALL MATCH
9      10                                 ; Diff in#

# Details about extractall
>>> df['Matches'].str.extractall('(; [^-]+) -(\d+)')
                   0   1
  match                 
0 0      ; ALL MATCH   3
4 0      ; ALL MATCH   6
7 0      ; ALL MATCH   9
  1       ; Diff in#  10

【讨论】:

    【解决方案2】:

    创建一个临时 DataFrame 为:

    wrk = df.Matches.str.extractall(r'(?P<Result>;\D+)-(?P<id>\d+)')
    

    然后从 Result 列中去除尾随空格:

    wrk.Result = wrk.Result.str.strip()
    

    下一步是将id列的类型改为int,如下 到目前为止它是 object 类型(实际上是一个 string):

    wrk.id = wrk.id.astype('int64')
    

    并将其设置为索引:

    wrk.set_index('id', inplace=True)
    

    现在wrk其实是一个系列,包含:

             Result
    id             
    3   ; ALL MATCH
    6   ; ALL MATCH
    9   ; ALL MATCH
    10   ; Diff in#
    

    然后,要生成结果,运行:

    res = df.merge(wrk, how='left', left_on='ROW_ID', right_index=True)
    

    结果是:

       ROW_ID                       Matches       Result
    0       1                ; ALL MATCH -3          NaN
    1       2                           NaN          NaN
    2       3                           NaN  ; ALL MATCH
    3       4                           NaN          NaN
    4       5                ; ALL MATCH -6          NaN
    5       6                           NaN  ; ALL MATCH
    6       7                           NaN          NaN
    7       8  ; ALL MATCH -9; Diff in# -10          NaN
    8       9                           NaN  ; ALL MATCH
    9      10                           NaN   ; Diff in#
    

    如果您不想在“未填充”字段中出现“NaN”,请附加 .fillna('') 到最后一条指令。

    【讨论】:

      猜你喜欢
      • 2021-05-06
      • 2020-05-23
      • 1970-01-01
      • 2023-03-22
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2021-05-11
      相关资源
      最近更新 更多