python - 根据条件连接列值

标签 python pandas

这段代码:

import numpy as np
import pandas as pd

df = pd.DataFrame(['a1', 'a2', 'stop', 'a4', 'a4', 'a5', 'stop', 'a3'],
                  columns=['c'])

呈现:

      c
0    a1
1    a2
2  stop
3    a4
4    a4
5    a5
6  stop
7    a3

我正在尝试生成以下数据框,其中一列中的值被连接起来,直到遇到“停止”值:

columns = ['c1' , 'c2']
data = np.array([['a1, a2','stop'] , ['a4, a4, a5','stop']])
df = pd.DataFrame(data, columns=columns)
df

           c1    c2
0      a1, a2  stop
1  a4, a4, a5  stop

这是一种有效的方法吗,过滤列值为“stop”的行:

df[df['c'] == 'stop']

然后访问前面的行?

最佳答案

首先,通过测试 c 是否等于“stop”来创建一个 bool 掩码:

>>> df = pd.DataFrame(['a1', 'a2', 'stop', 'a3', 'a4', 'a5', 'stop', 'a6'],
                      columns=['c'])
>>> mask = df['c'].eq('stop')

您还指定要忽略最终停止后的值。截断两个系列:

>>> stop = mask[::-1].idxmax()
>>> mask = mask[:stop]
>>> c = df['c'][:stop].copy()

现在分组:

>>> c.groupby(mask.cumsum()).apply(lambda s: s[s!='stop'].tolist())
c
0        [a1, a2]
1    [a4, a4, a5]

对于累积和,True 映射到 1,False 映射到 0。这用作分组。

脚注 - 无论系列中的最终值是否以 stop 结束,此逻辑都应该有效。

关于python - 根据条件连接列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48373687/

相关文章:

python - R 或 Python 中是否有函数/工作流来绘制每个位置的字符以进行单词比较?

python - while循环不处理异常

python - python 中对象的字典键项

Python:使用 pandas 导入 csv。尝试绘制一列,但出现错误,提示 "no numerical data to plot"

python - 在具有不同比例的不同轴上绘制两个数据框列

python - 您如何模拟 App Engine 中的用户服务?

python - 在Django中间件修改地址

python-3.x - 从 .txt 文件读取到 pandas 数据框,并以换行符作为分隔符

python - 在 Pandas 中按时间顺序合并日期数据框

python - Pandas 数据框按修改后的索引进行分组