用带分隔符的分隔符将几行串联在一起

2024-04-26 05:40:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望能够根据一个ID将几行上的字符串连接成一行。你知道吗

val   id
Cat   1
Tiger 2
Ball  3
Bat   1
bill  2
dog   1

l = []
a = 0
while a < lendata:
    if df["id"][a] == 1:
        if a != 0:
            df["val"][tmp] = ' '.join(l)
            l = []
        tmp = a
        l.append(df["val"][a])
    else:
        l.append(df["val"][a])
    a += 1

它适用于循环。 我需要这个结果

val
Cat Tiger Ball
Bat bill
dog

不是一个小组

问题:你知道如何使用熊猫功能吗? 谢谢。你知道吗


Tags: 字符串iddfifvaltmpcattiger
3条回答

入住熊猫:

df['group'] = (df['id'] == 1).cumsum()
df.groupby('group')['val'].apply(' '.join).reset_index()
   id             val
0   1  Cat Tiger Ball
1   2        Bat bill
2   3             dog

第一行根据您的定义定义组。第二行是标准的groupby操作。你知道吗

也可以创建如下数组:

a = np.array(range(len(df)))

然后创建第三列,该列等于id减去上一个数组。第三栏将显示哪些val在一起。你知道吗

df['regroup'] = df['id'].subtract(a)

输出:

id  val regroup
0   1   Cat 1
1   2   Tiger   1
2   3   Ball    1
3   1   Bat -2

现在,您可以使用分组方式获得所需的输出:

In [1] : df.groupby(['regroup'])['val'].apply(' '.join)
Out[1] : regroup
-2               Bat 
 1    Cat Tiger Ball 

np.split

  • 使用np.diff并找出那些差异小于零的地方
  • np.split这些位置的val

[*map(' '.join, np.split(df.val, np.flatnonzero(np.diff(df.id) < 0) + 1))]

['Cat Tiger Ball', 'Bat']

pd.Series([*map(' '.join, np.split(df.val, np.flatnonzero(np.diff(df.id) < 0) + 1))])

0    Cat Tiger Ball
1               Bat
dtype: object

组合智慧

使用IanS的思想检查id等于1

[*map(' '.join, np.split(df.val, np.flatnonzero(df.id == 1)[1:]))]

相关问题 更多 >