如何根据 Row_id 列将值写入数据框的另一列并且匹配列中存在值?
Posted
技术标签:
【中文标题】如何根据 Row_id 列将值写入数据框的另一列并且匹配列中存在值?【英文标题】:How to write the values to another column of dataframe based on Row_id column and value exist in match column? 【发布时间】:2022-01-24 05:55:37 【问题描述】:我有一个像这样的数据框,其中包含 ROW_ID 和 Matches 列。根据 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”开头的元素之外,你可以有其他元素吗?其他栏目?等等 【参考方案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('')
到最后一条指令。
【讨论】:
以上是关于如何根据 Row_id 列将值写入数据框的另一列并且匹配列中存在值?的主要内容,如果未能解决你的问题,请参考以下文章
Liquibase:将值从一列复制到具有数组数据类型的另一列