连接Pandas DataFrame中的行

时间:2019-12-01 16:20:11

标签: python pandas dataframe

我对Pandas的DataFrame对象有问题。

我已经读取了csv文件,并且有这样的DataFrame:

enter image description here

我想用符号“ |”连接行之间的行, 它应该看起来像这样:

enter image description here

具有类似Pandas的功能,以特定的分隔符连接行 或者我应该如何实现

2 个答案:

答案 0 :(得分:0)

我假设感兴趣的列的名称为 txt

定义以下函数以连接组的内容 字段:

def concatRows(grp):
    tt = grp[grp != '|'].to_list()
    rv = ' '.join(tt)
    return rv if len(rv) > 0 else None

在您的样本数据中,我注意到有关最后一行的“边缘情况”: 它包含一个空字符串,应丢弃 (而不是创建一个空行)。

要考虑到这一点,上述功能会检测到这种情况,然后 返回 None (稍后将进行实际删除)。

然后通过以下方式应用此功能:

df.groupby((df.txt == '|').cumsum()).txt.apply(concatRows).dropna()

请注意,(df.txt =='|')。cumsum()返回以下组:

  • 第1组-索引为0-2(无任何'|')的行。
  • 第2组-索引为3-7(以'|'开头)的行。
  • 依此类推。

因此 grp [grp!='|'] 删除了元素=='|' (如果有)。 然后 rv 包含联接结果。 但是,如果 rv 空字符串,则会返回 None

然后,通过最终调用 dropna 删除所有 None 情况。

答案 1 :(得分:0)

如果您的列不太大,可以用它做成一个字符串,然后在'|'处分割它。最后,创建一系列新的结果列表。

se = pd.Series(['foo', 'foobar', '|', 'bar', '|', '|', 'alpha'])
print(se)
0       foo
1    foobar
2         |
3       bar
4         |
5         |
6     alpha
dtype: object
se = pd.Series(se.str.cat(sep=' ').split('|'))
se = se.loc[se.ne(' ')].reset_index(drop=True)

# with the last step you remove ' ' elements created from consecutive '|'s.
print(se)
0    foo foobar 
1           bar 
2          alpha
dtype: object

se 是DataFrame的列。