我有一个包含三列的数据帧:"箱号"、"间隔"和"其他",其中前两列包含数值,最后一列包含对象类型的值。如果"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