如何解决Pandas Python每3列中有2列排在最前面,并列出结果
假设我具有以下数据框:
. Column1 Column2
0 25 1
1 89 2
2 59 3
3 78 10
4 99 20
5 38 30
6 89 100
7 57 200
8 87 300
我不确定我想做的事是否可行。但是我想比较column1的每三行,然后从三行中取出最高的2行,并将对应的2个Column2值分配给新列。列3中的值是否联接都无关紧要。排列是否无关紧要,因为我知道第3列的每2行都属于第1列的每3行。
. Column1 Column2 Column3
0 25 1 2
1 89 2 3
2 59 3
3 78 10 20
4 99 20 10
5 38 30
6 89 100 100
7 57 200 300
8 87 300
解决方法
您可以将np.arange
与np.repeat
一起使用,以创建将每3个值分组的分组数组。
然后使用GroupBy.nlargest
,然后使用pd.Index.get_level_values
提取这些值的索引,然后将它们分配给Column3
熊猫手柄index alignment
。
n_grps = len(df)/3
g = np.repeat(np.arange(n_grps),3)
idx = df.groupby(g)['Column1'].nlargest(2).index.get_level_values(1)
vals = df.loc[idx,'Column2']
vals
# 1 2
# 2 3
# 4 20
# 3 10
# 6 100
# 8 300
# Name: Column2,dtype: int64
df['Column3'] = vals
df
Column1 Column2 Column3
0 25 1 NaN
1 89 2 2.0
2 59 3 3.0
3 78 10 10.0
4 99 20 20.0
5 38 30 NaN
6 89 100 100.0
7 57 200 NaN
8 87 300 300.0
要获得问题中提到的输出,您必须排序并按NaN
到最后,然后执行此附加步骤。
df['Column3'] = df.groupby(g)['Column3'].apply(lambda x:x.sort_values()).values
Column1 Column2 Column3
0 25 1 2.0
1 89 2 3.0
2 59 3 NaN
3 78 10 10.0
4 99 20 20.0
5 38 30 NaN
6 89 100 100.0
7 57 200 300.0
8 87 300 NaN
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。