python - Pandas - 从列中提取多个数据

标签 python pandas

我的数据框中有一列,其中包含以下格式的一些数据:

['com.atlassian.greenhopper.service.sprint.Sprint@339ba62[id=001,rapidViewId=24,state=CLOSED,name=proj_a,goal=,startDate=2015-01-01T04:00:26.231Z,endDate=2015-01-13T14:36:00.000Z,completeDate=2015-02-13T14:07:09.739Z,sequence=001]

我试图从上面的列中提取 id 值,我可以使用以下方法来完成:

df['id'] = df['value'].astype(str).str.split('id').str[1]
df['id'] = df['id'].str.split(',').str[0]
df['id'] = df['id'].str.split('=').str[1]

我现在遇到一个问题,其中同一字段有多个此类值,如下所示:

['com.atlassian.greenhopper.service.sprint.Sprint@339ba62[id=001,rapidViewId=24,
state=CLOSED,name=proj_a,goal=,startDate=2015-01-01T04:00:26.231Z,endDate=2015-01-13T14:36:00.000Z,
completeDate=2015-02-13T14:07:09.739Z,sequence=001]', 
'com.atlassian.greenhopper.service.sprint.Sprint@10b316d8[id=002,rapidViewId=24,
state=CLOSED,name=proj_b,goal=,startDate=2016-01-01T04:00:26.231Z,
endDate= 2016-01-13T14:36:00.000Z,completeDate= 2016-02-13T14:07:09.739Z,sequence=002]', 
'com.atlassian.greenhopper.service.sprint.Sprint@2a13ba77[id=003,
rapidViewId=24,state=CLOSED,name=proj_c,goal=,
startDate= 2017-01-01T04:00:26.231Z,endDate= 2017-01-13T14:36:00.000Z,
completeDate= 2017-02-13T14:07:09.739Z,sequence=003]',
 'com.atlassian.greenhopper.service.sprint.Sprint@76d3dba0[id=004,rapidViewId=24,
state=CLOSED,name=proj_d,goal=,startDate=2018-01-01T04:00:26.231Z,
endDate= 2018-01-13T14:36:00.000Z,completeDate= 2018-02-13T14:07:09.739Z,sequence=004]', 'com.atlassian.greenhopper.service.sprint.Sprint@307a51a2[id=005,
rapidViewId=24,state=CLOSED,name=proj_e,goal=,startDate=2019-01-01T04:00:26.231Z,
endDate= 2019-01-13T14:36:00.000Z,completeDate= 2019-02-13T14:07:09.739Z,sequence=005]']

预期输出:

001,002,003,004,005

我正在尝试提取与 id 相对应的值并将它们存储在单个字段中

最佳答案

使用str.findall

例如:

df = pd.DataFrame({"value": ['com.atlassian.greenhopper.service.sprint.Sprint@339ba62[id=001,rapidViewId=24,state=CLOSED,name=proj_a,goal=,startDate=2015-01-01T04:00:26.231Z,endDate=2015-01-13T14:36:00.000Z,completeDate=2015-02-13T14:07:09.739Z,sequence=001]', 'com.atlassian.greenhopper.service.sprint.Sprint@10b316d8[id=002,rapidViewId=24,state=CLOSED,name=proj_b,goal=,startDate=2016-01-01T04:00:26.231Z,endDate= 2016-01-13T14:36:00.000Z,completeDate= 2016-02-13T14:07:09.739Z,sequence=002]', 'com.atlassian.greenhopper.service.sprint.Sprint@2a13ba77[id=003,rapidViewId=24,state=CLOSED,name=proj_c,goal=,startDate= 2017-01-01T04:00:26.231Z,endDate= 2017-01-13T14:36:00.000Z,completeDate= 2017-02-13T14:07:09.739Z,sequence=003]', 'com.atlassian.greenhopper.service.sprint.Sprint@76d3dba0[id=004,rapidViewId=24,state=CLOSED,name=proj_d,goal=,startDate=2018-01-01T04:00:26.231Z,endDate= 2018-01-13T14:36:00.000Z,completeDate= 2018-02-13T14:07:09.739Z,sequence=004]', 'com.atlassian.greenhopper.service.sprint.Sprint@307a51a2[id=005,rapidViewId=24,state=CLOSED,name=proj_e,goal=,startDate=2019-01-01T04:00:26.231Z,endDate= 2019-01-13T14:36:00.000Z,completeDate= 2019-02-13T14:07:09.739Z,sequence=005]']})
df["id"] = df["value"].str.findall(r"id\=(\d+),")
print(df)

输出:

                                               value   id
0  com.atlassian.greenhopper.service.sprint.Sprin...  001
1  com.atlassian.greenhopper.service.sprint.Sprin...  002
2  com.atlassian.greenhopper.service.sprint.Sprin...  003
3  com.atlassian.greenhopper.service.sprint.Sprin...  004
4  com.atlassian.greenhopper.service.sprint.Sprin...  005

如果您的 DF 包含单个列表中的所有值,请使用。

df = pd.DataFrame({"value": [['com.atlassian.greenhopper.service.sprint.Sprint@339ba62[id=001,rapidViewId=24,state=CLOSED,name=proj_a,goal=,startDate=2015-01-01T04:00:26.231Z,endDate=2015-01-13T14:36:00.000Z,completeDate=2015-02-13T14:07:09.739Z,sequence=001]', 'com.atlassian.greenhopper.service.sprint.Sprint@10b316d8[id=002,rapidViewId=24,state=CLOSED,name=proj_b,goal=,startDate=2016-01-01T04:00:26.231Z,endDate= 2016-01-13T14:36:00.000Z,completeDate= 2016-02-13T14:07:09.739Z,sequence=002]', 'com.atlassian.greenhopper.service.sprint.Sprint@2a13ba77[id=003,rapidViewId=24,state=CLOSED,name=proj_c,goal=,startDate= 2017-01-01T04:00:26.231Z,endDate= 2017-01-13T14:36:00.000Z,completeDate= 2017-02-13T14:07:09.739Z,sequence=003]', 'com.atlassian.greenhopper.service.sprint.Sprint@76d3dba0[id=004,rapidViewId=24,state=CLOSED,name=proj_d,goal=,startDate=2018-01-01T04:00:26.231Z,endDate= 2018-01-13T14:36:00.000Z,completeDate= 2018-02-13T14:07:09.739Z,sequence=004]', 'com.atlassian.greenhopper.service.sprint.Sprint@307a51a2[id=005,rapidViewId=24,state=CLOSED,name=proj_e,goal=,startDate=2019-01-01T04:00:26.231Z,endDate= 2019-01-13T14:36:00.000Z,completeDate= 2019-02-13T14:07:09.739Z,sequence=005]']]})
df["id"] = df["value"].apply(",".join).str.findall(r"id\=(\d+),").apply(",".join)
print(df)

输出:

                                               value                   id
0  [com.atlassian.greenhopper.service.sprint.Spri...  001,002,003,004,005

关于python - Pandas - 从列中提取多个数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56654968/

相关文章:

python - 从 2000 年 1 月 1 日开始从 UNIX 时间转换为时间戳

python - PyTorch 中的高效指标评估

python - 为表中的键创建计数的快速方法

python - 将多嵌套的 dict/json 加载到 pandas 中

python - Python 的 JSON 响应格式

python - 拆分:ValueError:需要超过 1 个值来解压 python

python - 合并并完成两个 pandas 数据框的值

python - 计算每行中缺失/NaN 的数量

python - 提取 pandas 多索引数据帧的子集

python - 导入 urllib 和导入 http.client 时出错