我在 pandasas df 中有一个表:
p_id_x p_id_y count
a b 2
b c 4
a c 8
d a 1
x a 6
m b 3
c z 7
我想写一个函数
def function_combination(p_id):
df[['p_id_x', 'p_id_y']] = df[['p_id_x', 'p_id_y']].apply(sorted, axis=1)
df.groupby(['p_id_x', 'p_id_y'], as_index=False)['count'].sum()
(功能未完成且有错误。) 我通过单独运行函数内的代码得到了结果。
df['p_id_x','p_id_y']
p_id_x p_id_y
a b
b c
a c
a d
a x
b m
c z
但是我希望我的输出看起来像这样:
p_id_x p_id_y
a b
a c
a d
a x
b c
b m
c z
即首先是 a,然后是 b,最后是 c 的所有组合。
这只是我的行的一部分。我有 20 多个这样的行。 有没有办法做到这一点,以便我可以将我的代码放在函数中?
最佳答案
您需要添加sort_values
按列p_id_x
:
df[['p_id_x', 'p_id_y']] = df[['p_id_x', 'p_id_y']].apply(sorted, axis=1)
df = df.groupby(['p_id_x', 'p_id_y'], as_index=False)['count'].sum().sort_values('p_id_x')
print (df)
p_id_x p_id_y count
0 a b 2
1 a c 8
2 a d 1
3 a x 6
4 b c 4
5 b m 3
6 c z 7
print (df[['p_id_x','p_id_y']])
p_id_x p_id_y
0 a b
1 a c
2 a d
3 a x
4 b c
5 b m
6 c z
通过评论编辑 - 使用 boolean indexing
:
mask = (df.p_id_x == 'a') & (df['count'] > 3)
print (mask)
0 False
1 True
2 False
3 True
4 False
5 False
6 False
dtype: bool
print (df[mask])
p_id_x p_id_y count
1 a c 8
3 a x 6
或者query
:
print (df.query("p_id_x == 'a' and count > 3"))
p_id_x p_id_y count
1 a c 8
3 a x 6
关于python - 在 pandas df 中按顺序排列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40779184/