在 Pandas 数据框中折叠行

13

我正在尝试合并数据框中包含ID数据列和多个包含不同字符串的列的行。似乎groupby是解决方案,但它似乎倾向于在组上执行某些数字函数-我只想保留文本。以下是我的代码:

我有一个如下所示的数据框:

index    ID     apples    pears    oranges
0        101                       oranges
1        134    apples
2        576              pears
3        837    apples
4        576                       oranges
5        134              pears

这些栏目已清理干净:所以苹果栏中只会有文字“apples”,或者为空。

在同一ID下有多个条目时(在此示例中为134和576),我想将行折叠在一起以获得如下结果:

index    ID     apples    pears    oranges
0        101                       oranges
1        134    apples    pears
2        576              pears    oranges
3        837    apples

我可以通过迭代行来完成此操作,但这似乎不是pandas的解决方案。有更好的方法吗?

2个回答

23
你可以使用 groupby 方法与聚合函数 ''.join, summax 一起使用:
#if blank values are NaN first replace to ''
df = df.fillna('')

df = df.groupby('ID').agg(''.join)
print (df)
     apples  pears  oranges
ID                         
101                 oranges
134  apples  pears         
576          pears  oranges
837  apples   

同样适用于:

df = df.fillna('')
df = df.groupby('ID').sum()
#alternatively max
#df = df.groupby('ID').max()
print (df)
     apples  pears  oranges
ID                         
101                 oranges
134  apples  pears         
576          pears  oranges
837  apples     

此外,如果需要按组和列删除重复项,请添加unique。请注意保留HTML标记。
df = df.groupby('ID').agg(lambda x: ''.join(x.unique()))

2
第一个建议完美地起作用了。感谢您的帮助!您能否描述一下这行代码中发生了什么:df = df.groupby('ID').agg(''.join) - user4896331
1
对于user4896331和jezrael的警告和非常晚的回应,.agg(''.join) 对我非常有效(有关基本概念的更多信息在此处:https://docs.python.org/3/reference/expressions.html#lambda),但是当我使用`.agg(lambda x: ''.join(x.unique()))时,pandas会删除具有空白的列。我必须使用.astype(str).replace(to_replace=[None],value='')`才能最终获得所有起始数据。值得注意的是,在我的情况下,所有数据都可以是字符串。 - ptmalcolm

6
假设空白为'' 选项1
pivot_table
df.pivot_table(['apples', 'pears', 'oranges'], 'ID', aggfunc=''.join)

选项 2
sort 并且将最后一行作为 '',会首先进行排序

def f(df):
    return pd.DataFrame(np.sort(df.values, 0)[[-1]], [df.name], df.columns)

df.set_index(
    'ID', append=True
).groupby(level='ID', group_keys=False).apply(f)

无法确定需要翻译的内容,请提供更详细的信息。
     apples  oranges  pears
ID                         
101          oranges       
134  apples           pears
576          oranges  pears
837  apples                

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