基于列折叠数据帧



我有一个包含三列的数据帧:"箱号"、"间隔"和"其他",其中前两列包含数值,最后一列包含对象类型的值。如果"Bin No"中的值存在多次,我正在尝试折叠行,保留其他两列的值。我当前的数据帧如下所示:

Intervals  Bin No            Other
0        1.5       1                 
1        2.5       2                 
4        3.5       3                 
6        4.5       4                 
8        5.5       5                 
9        8.5       6                 
11      12.5       7                 
2       16.0       8                 
3       22.0       9                 
5       37.0      10                 
12                10  [-99999997, -3]
7       61.0      11                 
10      87.0      12                 
13                14               -2
14                15               -1

在本例中,10 在"Bin No"中出现两次,因此数据帧应如下所示:

Bin No  Intervals            Other
0       1        1.5                 
7       2        2.5                 
8       3        3.5                 
9       4        4.5                 
10      5        5.5                 
11      6        8.5                 
12      7       12.5                 
13      8       16.0                 
14      9       22.0                 
2      10       37.0  [-99999997, -3]
3      11       61.0                 
4      12       87.0                 
5      14                          -2
6      15                          -1

我已经设法使用以下代码找到了解决方案,但是我担心这可能会在以后df.drop_duplicates产生问题:

df_one = df.groupby('Bin No', as_index=False).agg(''.join)
df_two = pd.merge(df_two, df.drop('Intervals', axis=1), how='left', on='Bin No')
df_three = df_two.drop_duplicates('Bin No', keep='last')

有没有更有效、更少模棱两可的解决方案?

您可以将空字符串替换为 NaN 值;然后使用groupby+first(利用first跳过 NaN 的事实)。您可以将 NaN 替换回空字符串,但我想这有点多余:

out = df.replace('', np.nan).groupby('Bin No', as_index=False)[['Intervals', 'Other']].first()
out['Other'] = out['Other'].fillna('')

输出:

Bin_No  Intervals            Other
0        1        1.5                 
1        2        2.5                 
2        3        3.5                 
3        4        4.5                 
4        5        5.5                 
5        6        8.5                 
6        7       12.5                 
7        8       16.0                 
8        9       22.0                 
9       10       37.0  [-99999997, -3]
10      11       61.0                 
11      12       87.0                 
12      14        NaN               -2
13      15        NaN               -1

最新更新