Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于第二列合并一列中的行_Python_Pandas - Fatal编程技术网

Python 基于第二列合并一列中的行

Python 基于第二列合并一列中的行,python,pandas,Python,Pandas,我在dataframe中有两列。一个是名字,另一个是位置 我想通过在Pos列上应用循环来修改这个数据帧。从B-PER值开始,将名称列中的名称连接起来,直到Pos列中的值再次变为B-PER,然后重复 df = pd.DataFrame() df['names'] = ['John', 'Smith', 'Adam', 'Marry', 'Leo', 'Lauana'] df['POS'] = ['B-PER', 'I-PER', 'I-PER', 'B-PER', 'I-PER', 'B-PH'

我在dataframe中有两列。一个是名字,另一个是位置

我想通过在Pos列上应用循环来修改这个数据帧。从B-PER值开始,将名称列中的名称连接起来,直到Pos列中的值再次变为B-PER,然后重复

df = pd.DataFrame()

df['names'] = ['John', 'Smith', 'Adam', 'Marry', 'Leo', 'Lauana']
df['POS'] = ['B-PER', 'I-PER', 'I-PER', 'B-PER', 'I-PER', 'B-PH']

df.groupby(df['POS'].eq('B-PER').cumsum()).agg({'names': '+'.join, 'POS': '+'.join})

    names             POS   
1   John+Smith+Adam B-PER+I-PER+I-PER
2   Marry+Leo       B-PER+I-PER
3   Lauana          B-PH

您可以通过检查POS列中B-PER的相等性并在布尔掩码上运行求和来创建伪列。稍后,groupby将覆盖此新列并执行所需的聚合

df = pd.DataFrame()

df['names'] = ['John', 'Smith', 'Adam', 'Marry', 'Leo']
df['POS'] = ['B-PER', 'I-PER', 'I-PER', 'B-PER', 'I-PER']

df.groupby(df['POS'].eq("B-PER").cumsum()).agg({'names': '+'.join, 'POS': '+'.join})

    names             POS
POS     
1   John+Smith+Adam B-PER+I-PER+I-PER
2   Marry+Leo       B-PER+I-PER
根据评论(不清楚)


实际上,我忘了在dataframe中提到一件事,即Pos列中除了B-PER和i-PER之外还有一个值,即B-PH,这一行不应与其他行合并。如何可能的名字POS 1 John+Smith+Adam B-PER+I-PER+I-PER 2 Marry+Leo B-PER+I-PER 3 Lauana B-PH我将如何获得此输出?请更新您的Q。将数据框添加为文本而不是图像。答案非常有效。谢谢你,伙计
df = pd.DataFrame()

df['names'] = ['John', 'Smith', 'Adam', 'Marry', 'Leo', "Launa"]
df['POS'] = ['B-PER', 'I-PER', 'I-PER', 'B-PER', 'I-PER', "B-PH"]

df.groupby((df['POS'].eq("B-PER") | df['POS'].eq("B-PH")).cumsum(), as_index=False).agg({'names': '+'.join, 'POS': '+'.join})



            names   POS
0   John+Smith+Adam B-PER+I-PER+I-PER
1   Marry+Leo       B-PER+I-PER
2   Launa           B-PH