将行合并为单个单元格

3

I currently have a dataframe (df) like this:

name    info
alpha   foo,bar
alpha   bar,foo
beta    foo,bar
beta    bar,foo
beta    baz,qux

我希望创建一个像这样的数据框:

name    info
alpha   (foo,bar),(bar,foo)
beta    (foo,bar),(bar,foo),(baz,qux)

我正在使用groupby.apply(list)。

new_df=df.groupby('name')['info'].apply(list)

然而,我不知道如何将输出格式化为原始数据框的格式(即像示例中那样有两列)。

我认为我需要使用reset_indexunstack? 感谢任何帮助!


你有什么问题? - BENY
@Wen 我想创建与我提供的示例类似的数据框。但是我缺少一两个步骤,而我无法弄清楚它们是什么。 - Kvothe
pd.DataFrame(df.groupby('name')['info'].apply(list))?我感觉还有更简单的方法。 - Patrick Haugh
在你的输入中,'info'是一个单独的字符串还是一组字符串?而在你的输出中,那是一个单独的字符串还是一组元组? - Scott Boston
@ScottBoston 抱歉,这是一个字符串列表。我应该提一下的。 - Kvothe
@PatrickHaugh 您的建议很有效。谢谢 :) - Kvothe
3个回答

2

尝试使用for循环:

uniqnames = df.name.unique() # get unique names
newdata = []                 # data list for output dataframe
for u in uniqnames:          # for each unique name
    subdf = df[df.name == u] # get rows with this unique name
    s = ""
    for i in subdf['info']:
        s += "("+i+"),"      # join all info cells for that name
    newdata.append([u, s[:-1]]) # remove trailing comma from infos & add row to data list

newdf = pd.DataFrame(data=newdata, columns=['name','info'])
print(newdf)

输出结果与期望的完全相同:

    name                           info
0  alpha            (foo,bar),(bar,foo)
1   beta  (foo,bar),(bar,foo),(baz,qux)

1
我理解为:
df.assign(info='('+df['info']+')').groupby('name')['info'].apply(','.join).to_frame('info')
Out[267]: 
                                info
name                                
alpha            (foo,bar),(bar,foo)
beta   (foo,bar),(bar,foo),(baz,qux)



#df.assign(info='('+df['info']+')')# adding the ( and ) for your single string to match with the out put 
#groupby('name')# group by the name, you need merge info under the same name
#apply(','.join).to_frame('info') # this will combine each info into one string under the same group

这可能是正确的,但帮助OP理解您是如何得出这个结论会更好。那么,“IIUC”是什么意思? - dirkgroten
1
@Nae 加上它:-) - BENY
1
@dirkgroten 添加解释,IIUC 的意思是“如果我理解正确”。 - BENY

0

IIUC:

df = pd.DataFrame({'name':['alpha']*2+['beta']*3,
                   'info':[['foo','bar'],['bar','foo'],
                           ['foo','bar'],['bar','foo'],
                           ['baz','qux']]})
print(df)

输入:

         info   name
0  [foo, bar]  alpha
1  [bar, foo]  alpha
2  [foo, bar]   beta
3  [bar, foo]   beta
4  [baz, qux]   beta

现在,使用groupby和apply,然后使用reset_index()返回到数据框:
new_df = df.groupby('name')['info'].apply(list)

new_df = new_df.reset_index()

print(new_df)

输出:

    name                                  info
0  alpha              [[foo, bar], [bar, foo]]
1   beta  [[foo, bar], [bar, foo], [baz, qux]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接