繁体   English   中英

如何根据 Row_id 列将值写入 dataframe 的另一列并且匹配列中存在值?

[英]How to write the values to another column of dataframe based on Row_id column and value exist in match column?

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

ROW_ID 火柴
1 ; 所有比赛 -3
2
3
4
5 ; 所有比赛 -6
6
7
8 ; 全场比赛-9; 差异# -10
9
10

这意味着最终的 dataframe 应该是这样的。

ROW_ID 结果
1
2
3 ; 所有比赛
4
5
6 ; 所有比赛
7
8
9 ; 所有比赛
10 ; 差异#

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

尝试:

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

Output:

>>> 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

创建一个临时 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实际上是一个Series ,包含:

         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”,则 append .fillna('')到最后一条指令。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM