将元组转换为数据框中的分组行,而无需更改顺序

发布于 2025-02-09 01:04:01 字数 527 浏览 2 评论 0原文

我有一个元组,需要将其转换为数据框架。

res1_ =  [
  ('z1', '1'),
  ('z1', '2'),
  ('x1', '1'),
  ('x2', '1'),
  ('x1', '3'),
  ('z1', '1')]

我的预期数据帧应该是这样的:

docid secid
z1    [1,2]
x1    [1]
x2    [1]
x1    [3]
z1    [1]

如果注意到,则不会更改订单,如果在下一行中重复DOCID,则将两个Secid合并到一个列表中。 尽管X1发生了两次,但SEC ID 1和3不在单个列表中,因为我们在X1中部有DOCID X2。

我尝试了:

df = pd.DataFrame(res1_,columns=['docid','secid'])
df.groupby('docid')['secid'].apply(list)

但是当我失去订单时,没有运气,x1也被分组。

I have a tuple and I need to convert it to dataframe.

res1_ =  [
  ('z1', '1'),
  ('z1', '2'),
  ('x1', '1'),
  ('x2', '1'),
  ('x1', '3'),
  ('z1', '1')]

My expected dataframe should be like this :

docid secid
z1    [1,2]
x1    [1]
x2    [1]
x1    [3]
z1    [1]

If you note, the order is not changed and if docid get repeated in next row, then two secids are merged into a single list.
Although x1 is occurring twice, sec id 1 and 3 are not in single list as we have docid x2 in mid of the x1s.

I tried with :

df = pd.DataFrame(res1_,columns=['docid','secid'])
df.groupby('docid')['secid'].apply(list)

But no luck as I am losing the order and x1 too is grouped.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

七禾 2025-02-16 01:04:01

您可以使用dataframe构造函数,然后groupby.agg

df = pd.DataFrame(res1_, columns=['docid', 'setid'])
group = df['docid'].ne(df['docid'].shift()).cumsum()
df = df.groupby(group.values).agg({'docid': 'first', 'setid': list})

输出:

  docid   setid
1    z1  [1, 2]
2    x1     [1]
3    x2     [1]
4    x1     [3]
5    z1     [1]

You can use the DataFrame constructor, then GroupBy.agg:

df = pd.DataFrame(res1_, columns=['docid', 'setid'])
group = df['docid'].ne(df['docid'].shift()).cumsum()
df = df.groupby(group.values).agg({'docid': 'first', 'setid': list})

output:

  docid   setid
1    z1  [1, 2]
2    x1     [1]
3    x2     [1]
4    x1     [3]
5    z1     [1]
柳絮泡泡 2025-02-16 01:04:01

您可以使用 itertools.groupbys.groupbys.groupby 将数据分组,然后转换为数据框:

from itertools import groupby 

grps = [(k, [t[1] for t in g]) for k, g in itertools.groupby(res1_, key=lambda x:x[0])]
df = pd.DataFrame(grps, columns=['docid', 'secid'])

输出:

  docid   secid
0    z1  [1, 2]
1    x1     [1]
2    x2     [1]
3    x1     [3]
4    z1     [1]

You could use itertools.groupby to group the data, and then convert to a dataframe:

from itertools import groupby 

grps = [(k, [t[1] for t in g]) for k, g in itertools.groupby(res1_, key=lambda x:x[0])]
df = pd.DataFrame(grps, columns=['docid', 'secid'])

Output:

  docid   secid
0    z1  [1, 2]
1    x1     [1]
2    x2     [1]
3    x1     [3]
4    z1     [1]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文