折叠Pandas数据帧中的行

use*_*331 4 python-3.x pandas

我正在尝试折叠数据框中的行,该数据框包含一列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
Run Code Online (Sandbox Code Playgroud)

列是干净的:所以苹果列中只有文本"apples",或者它将是空白的".

如果在同一ID下有多个条目(在本例中,在ID 134和576上),我想将这些行折叠在一起以获得:

index    ID     apples    pears    oranges
0        101                       oranges
1        134    apples    pears
2        576              pears    oranges
3        837    apples
Run Code Online (Sandbox Code Playgroud)

我可以通过迭代行来做到这一点,但它似乎是一个非熊猫的解决方案.有没有更好的办法?

jez*_*ael 11

您可以使用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   
Run Code Online (Sandbox Code Playgroud)

还有效:

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     
Run Code Online (Sandbox Code Playgroud)

此外,如果需要删除每组和每列的重复项添加unique:

df = df.groupby('ID').agg(lambda x: ''.join(x.unique()))
Run Code Online (Sandbox Code Playgroud)

  • 第一个建议非常有效。感谢您的帮助!您是否有机会描述行中发生的情况: `df = df.groupby('ID').agg(''.join)` ? (2认同)

piR*_*red 6

假设空白是 ''

选项1
pivot_table

df.pivot_table(['apples', 'pears', 'oranges'], 'ID', aggfunc=''.join)
Run Code Online (Sandbox Code Playgroud)

选项 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)
Run Code Online (Sandbox Code Playgroud)

两者产量

     apples  oranges  pears
ID                         
101          oranges       
134  apples           pears
576          oranges  pears
837  apples                
Run Code Online (Sandbox Code Playgroud)