【问题标题】:I have pandas dataframe which contains two columns (column A & column B)我有熊猫数据框,其中包含两列(A 列和 B 列)
【发布时间】:2018-06-19 22:06:06
【问题描述】:

在 A 列中有 3 个句子(ABC、DEF、GHI)。句子以 & **以“ ”结尾 **

例如:这是一个句子

 Column A                           Column B

(('<s>', '<s>'),  'abc')            0.043025210084033615
(('<s>', 'abc'),  'abc')            0.65234375
(('abc', 'abc'),  'abc')            0.04259501965923984
(('abc', 'abc'),  'abc')            0.18604651162790697
(('abc', 'abc'),  '</s>')           0.41317365269461076
(('abc', '</s>'), '</s>')           0.011148272017837236

当一个句子以结束标记“'),''”结尾时,我想将 B 列乘以特定句子的所有行 示例:(0.04302521*0.65234375*0.04259502*0.186046512*0.413173653*0.011148272=1.02452)

我想得到每个数据帧的输出

 Column A                           Column B



 (('<s>', '<s>'),  'abc')            0.043025210084033615
 (('<s>', 'abc'),  'abc')            0.65234375
 (('abc', 'abc'),  'abc')            0.04259501965923984
 (('abc', 'abc'),  'abc')            0.18604651162790697
 (('abc', 'abc'),  '</s>')           0.41317365269461076
 (('abc', '</s>'), '</s>')           0.011148272017837236
 (('<s>', '<s>'),  'def')            0.09090909090909091
 (('def', 'def'),  'def')            0.008287292817679558
 (('def', 'def'),  'def')            0.13506493506493505
 (('def', 'def'),  '</s>')           0.007653061224489796
 (('def', '</s>'), '</s>')           0.08333333333333333
 (('<s>', '<s>'),  'ghi')            0.5
 (('ghi', 'ghi'),  'ghi')            0.125
 (('ghi', 'ghi'),  'ghi')            0.033766233766233764
 (('ghi', 'ghi'),  '</s>')           0.0694980694980695
 (('ghi','</s>'),  '</s>')           0.16666666666666666

输出应该是:(0.04302521*0.65234375*0.04259502*0.186046512*0.413173653*0.011148272=1.02452) (0.090909091*0.008287293*0.135064935*0.007653061*0.083333333=6.48958) (0.5*0.125*0.033766234*0.069498069*0.166666667=2.44447)

输出应为以下格式 1.02452 6.48958 2.44447

【问题讨论】:

  • 在同一个句子的新“块”之前是否总是有('&lt;s&gt;', '&lt;s&gt;')
  • 打破包含 的行), 来自 Pandas 数据帧的字符串模式我想将 B 列乘以特定句子的所有行

标签: python regex


【解决方案1】:

一种方法是创建一个“句子”列以供以后使用groupby。假设您的数据框称为df。我用 0 创建此列。

df['sentence'] = 0

现在,在 A 列包含 ('&lt;s&gt;', '&lt;s&gt;') 的列中输入 1,然后使用 cumsum 为每个句子设置不同的数字:

df['sentence'].loc[df['Column A'].str.contains("('<s>', '<s>')")] = 1
df['sentence'] = df['sentence'].cumsum()

您需要做的是对该列进行分组并使用prod

df.groupby('sentence')['Column B'].prod()
Out[527]: 
sentence
1.0    1.024519e-06
2.0    6.489579e-08
3.0    2.444467e-05
Name: Column B, dtype: float64

根据您对结果的精确程度,您可以使用df.groupby('sentence')['Column B'].prod().tolist() 将其作为列表获取

【讨论】:

  • 您好 Ben.T 感谢您的帮助!当我执行以下代码时: df['sentence'].loc[df['Column A'].str.contains("('', '')")] = 1 KeyError: ' [nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan] 不在索引中'
  • @Balu 在没有您准确输入的情况下不确定它是什么。在回答之前尝试df = df.reset_index(drop=True),可能索引号有问题
  • 我试过你的代码我仍然面临同样的问题df = df.reset_index(drop=True)我面临以下错误文件“C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py ",第 1327 行,在 _convert_to_indexer .format(mask=objarr[mask])) KeyError: '[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan ] 不在索引中'跨度>
  • @Balu 如果你这样做type(df['Column A'].loc[0]),你会得到什么?
  • @ Ben .T 在用 0 创建一个列(句子)之后,然后我运行了下面的命令,它被执行了 df['Column A'] = df['Column A'].astype(str)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 2021-02-08
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
相关资源
最近更新 更多