我希望能够根据ID将多行字符串合并为一个。我使用了熊猫库(python 3)。
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
不是分组依据
问题:您知道如何使用pandas函数吗? 谢谢。
答案 0 :(得分:6)
住在熊猫里
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
第一行根据您的定义定义组。第二行是标准的分组操作。
答案 1 :(得分:3)
您也可以像这样创建一个数组:
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
您现在可以使用group by获得所需的输出:
In [1] : df.groupby(['regroup'])['val'].apply(' '.join)
Out[1] : regroup
-2 Bat
1 Cat Tiger Ball
答案 2 :(得分:2)
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:]))]