【问题标题】:Merge the rows of a df based on contiguous values of a particular column Pandas根据特定列 Pandas 的连续值合并 df 的行
【发布时间】:2021-12-12 23:26:52
【问题描述】:

我有一个这样的 df:

    text    labels
0   2083    [CARDINAL (0.8677)]
1   2085    [CARDINAL (0.5846)]
2   1822    [DATE (0.9581)]
3   DHAKA.  [GPE (0.6306)]
4   BANGLADESH  [GPE (0.6535)]
5   2085    [CARDINAL (0.7502)]
6   Manlkganj   [GPE (0.8888)]
7   Bangladesh  [GPE (0.9916)]

我想要的是:

        text              labels
0   2083, 2085           CARDINAL
1   1822                  DATE
2   DHAKA. BANGLADESH      GPE
3   2085                 CARDINAL
4   Manlkganj Bangladesh    GPE

合并相同标签的连续值并将它们合并并使其成为一行并删除不在ls=['GPE', 'ORG', 'CARDINAL']中的每隔一行。

我以一种更加非 Python 的方式完成了它,使用 df.iterrows() 循环遍历 df,然后在 ls 中使用 df['labels'].str.split('('][0],需要很多时间,也没有得到正确的预期结果。我想知道是否有更有效的方法,字符串操作和行操作。

df to dict 'dict' 格式重新创建:

{'text': {0: '2083',
  1: '2085',
  2: '1822',
  3: 'DHAKA.',
  4: 'BANGLADESH',
  5: '2085',
  6: 'Manlkganj',
  7: 'Bangladesh',
  8: 'DHAKA',
  9: 'BANGLADESH'},
 'start_pos': {0: 49,
  1: 54,
  2: 107,
  3: 236,
  4: 243,
  5: 355,
  6: 396,
  7: 414,
  8: 540,
  9: 547},
 'end_pos': {0: 53,
  1: 58,
  2: 111,
  3: 242,
  4: 253,
  5: 359,
  6: 405,
  7: 424,
  8: 545,
  9: 557},
 'labels': {0: [CARDINAL (0.8677)],
  1: [CARDINAL (0.5846)],
  2: [DATE (0.9581)],
  3: [GPE (0.6306)],
  4: [GPE (0.6535)],
  5: [CARDINAL (0.7502)],
  6: [GPE (0.8888)],
  7: [GPE (0.9916)],
  8: [GPE (0.5669)],
  9: [GPE (0.878)]}}

提前致谢。

【问题讨论】:

  • 您可以从df.labels = df.labels.apply(lambda x: x.split(' (')[0][1:]) 开始转换标签列。
  • 您的labels 列似乎包含(一个)对象的列表。 CARDINAL/DATE/GPE 是什么?
  • 实体。是的,列出一项。 @QuangHoang

标签: python pandas string dataframe search


【解决方案1】:

开始

df.labels = df.labels.apply(lambda x: x[0].split()[0])

注意:如果你有一个大的DataFrame,你最好弄清楚如何使用df.explode('labels')。 然后使用

g = (df.labels != df.shift().fillna(method='bfill').labels).cumsum().rename('group')
df.groupby(['labels',g]).agg({'text': ', '.join})

从这里重做:Python/Pandas: Merging Consecutive Rows Only if Matching Columns

在这里:Concatenate strings from several rows using Pandas groupby

【讨论】:

  • 这会出现:AttributeError: 'list' object has no attribute 'split'
  • 标签栏中的type 是什么?是list,还是string
  • pandas.core.series.Series
  • 它没有生成我正在尝试构建的最终数据帧。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2019-01-04
  • 1970-01-01
  • 2019-10-12
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
  • 2021-09-19
相关资源
最近更新 更多