Python groupby两列中的公共值

Python groupby两列中的公共值,python,pandas,Python,Pandas,我需要从两列中具有公共值的行对中提取公共最大值 通用性在A列和B列中的值之间。第0行和第1行是通用的,第2行和第3行是通用的,第4行是独立的 f = DataFrame([[1, 2, 30], [2, 1, 20], [2, 6, 15], [6, 2, 70], [7, 10, 35]], columns=['A', 'B', 'Value']) f A B Value 0 1 2 30 1 2 1 20 2 2 6 15 3 6

我需要从两列中具有公共值的行对中提取公共最大值

通用性在A列和B列中的值之间。第0行和第1行是通用的,第2行和第3行是通用的,第4行是独立的

f = DataFrame([[1, 2, 30], [2, 1, 20], [2, 6, 15], [6, 2, 70], [7, 10, 35]], columns=['A', 'B', 'Value'])
f
   A   B  Value
0  1   2     30
1  2   1     20
2  2   6     15
3  6   2     70
4  7  10     35
目标是提取最大值,因此最终结果是:

f_final = DataFrame([[1, 2, 30, 30], [2, 1, 20, 30], [2, 6, 15, 70], [6, 2, 70, 70], [7, 10, 35, 35]], columns=['A', 'B', 'Value', 'Max'])
f_final

   A   B  Value  Max
0  1   2     30   30
1  2   1     20   30
2  2   6     15   70
3  6   2     70   70
4  7  10     35   35
如果有一种方法可以分配一个公共的、不重复的键,我可以这样做:

f_key = DataFrame([[1, 1, 2, 30], [1, 2, 1, 20], [2, 2, 6, 15], [2, 6, 2, 70], [3, 7, 10, 35]], columns=['key', 'A', 'B', 'Value'])
f_key

   key  A   B  Value
0    1  1   2     30
1    1  2   1     20
2    2  2   6     15
3    2  6   2     70
4    3  7  10     35
跟进groupby和transform:

f_key['Max'] = f_key.groupby(['key'])['Value'].transform(lambda x: x.max())
f_key.drop('key', 1, inplace=True)
f_key

   A   B  Value  Max
0  1   2     30   30
1  2   1     20   30
2  2   6     15   70
3  6   2     70   70
4  7  10     35   35
问题1: 如何分配这个公共密钥

问题2: 有没有更好的方法,跳过公共键步骤


干杯…

您可以对
A
B
列中的值进行排序,以便
A
中的每行值小于或等于
B
中的值。对值进行排序后,您可以像往常一样应用
groupby transform max

import pandas as pd
df = pd.DataFrame([[1, 2, 30], [2, 1, 20], [2, 6, 15], [6, 2, 70], [7, 10, 35]],
                  columns=['A', 'B', 'Value'])
mask = df['A'] > df['B']
df.loc[mask, ['A','B']] = df.loc[mask, ['B','A']].values
df['Max'] = df.groupby(['A', 'B'])['Value'].transform('max')

print(df)
屈服

   A   B  Value  Max
0  1   2     30   30
1  1   2     20   30
2  2   6     15   70
3  2   6     70   70
4  7  10     35   35
In [267]: df
Out[267]: 
    A   B  Value  Max
0  ab  ac     30   30
1  ab  ac     20   30
2  ca  cb     15   70
3  ca  cb     70   70
4  ff  zz     35   35

即使
A
B
中的值是字符串,上述方法仍然有效。比如说,

df = DataFrame([['ab', 'ac', 30], ['ac', 'ab', 20],
                 ['cb', 'ca', 15], ['ca', 'cb', 70],
                 ['ff', 'zz', 35]], columns=['A', 'B', 'Value'])

mask = df['A'] > df['B']
df.loc[mask, ['A','B']] = df.loc[mask, ['B','A']].values
df['Max'] = df.groupby(['A', 'B'])['Value'].transform('max')
屈服

   A   B  Value  Max
0  1   2     30   30
1  1   2     20   30
2  2   6     15   70
3  2   6     70   70
4  7  10     35   35
In [267]: df
Out[267]: 
    A   B  Value  Max
0  ab  ac     30   30
1  ab  ac     20   30
2  ca  cb     15   70
3  ca  cb     70   70
4  ff  zz     35   35

谢谢@unutbu。对于字符串有类似的方法吗?df=DataFrame([['ab',ac',30],'ac',ab',20],'cb',ca',15],'ca',cb',70],'ff',zz',35],[A',B',Value',35])啊,在这种情况下,几何体不会有帮助——除非先将值转换为因子。但这可能会抵消速度优势。使用分类和get_索引器。似乎有效。谢谢你的帮助。c=pd.Categorical.from_数组(df.A)idx=c.levels df['A1']=idx.get_索引器(df.A)df['B1']=idx.get_索引器(df.B)可能无法工作,因为
idx.get_索引器(df.B)
将在
B
中的值不在
A
中时返回-1。因此,
(ff,zz)
(ff,qq)
都将映射到类似
(4,-1)
@coredump的内容:即使值是字符串,第一个方法仍然有效。