根据 pandas 数据框中的条件分组查找匹配行
Find matching rows based on a conditional grouping in a pandas dataframe
我到处寻找这个答案,但 none 似乎满足了我的需要。这是我需要的虚拟示例:
data = {'id':[1, 2, 3, 4, 1, 1, 3, 4, 1],
'parent':['a', 'b', 'f', 'j', 'a', 'n', 'f', 'z', 'x'],
'vehicle':['car', 'car', 'truck', 'suv', 'car', 'hatch', 'truck', 'suv', 'car'],
'color':['red', 'blue', 'grey', 'green', 'red', 'purple', 'grey', 'green', 'red'],
'serial': [324234, 23464, 5667, 1245, 786, 34546, 8537, 111111, 8376251537]}
df = pd.DataFrame(data)
df.sort_values(by=['id', 'parent'], inplace=True)
id parent vehicle color serial
0 1 a car red 324234
4 1 a car red 786
5 1 n hatch purple 34546
8 1 x car red 8376251537
1 2 b car blue 23464
2 3 f truck grey 5667
6 3 f truck grey 8537
3 4 j suv green 1245
7 4 z suv green 111111
我需要的是获取 ID 相同 但 parent 不同 且车辆和颜色相同的所有行。
所以我要:
id parent vehicle color serial
0 1 a car red 324234
4 1 a car red 786
8 1 x car red 8376251537
3 4 j suv green 1245
7 4 z suv green 111111
请注意,我想包括上面的前两个,因为它们有不同的序列号。
编辑: 并且它们是具有不同 parent 和相同 ID 的分组的一部分。
我已经试过了,接近了:
target = df[df.duplicated(['id', 'vehicle', 'color'], keep=False)]
id parent vehicle color serial
0 1 a car red 324234
4 1 a car red 786
8 1 x car red 8376251537
2 3 f truck grey 5667
6 3 f truck grey 8537
3 4 j suv green 1245
7 4 z suv green 111111
但我不希望具有匹配的 id、车辆、颜色 if 对应的 parent 的行也相同。所以在这种情况下,我不想
id parent vehicle color serial
2 3 f truck grey 5667
6 3 f truck grey 8537
因为他们有相同的parent。
我考虑过分组和更改索引,但我正在做的事情不起作用。这似乎是一个简单的问题,也许确实如此,但我就是无法破解它!
IIUC,让我们试试这个:
df[df.groupby(['id','vehicle','color'])['parent'].transform('nunique') > 1]
输出:
id parent vehicle color serial
0 1 a car red 324234
4 1 a car red 786
8 1 x car red 8376251537
3 4 j suv green 1245
7 4 z suv green 111111
我到处寻找这个答案,但 none 似乎满足了我的需要。这是我需要的虚拟示例:
data = {'id':[1, 2, 3, 4, 1, 1, 3, 4, 1],
'parent':['a', 'b', 'f', 'j', 'a', 'n', 'f', 'z', 'x'],
'vehicle':['car', 'car', 'truck', 'suv', 'car', 'hatch', 'truck', 'suv', 'car'],
'color':['red', 'blue', 'grey', 'green', 'red', 'purple', 'grey', 'green', 'red'],
'serial': [324234, 23464, 5667, 1245, 786, 34546, 8537, 111111, 8376251537]}
df = pd.DataFrame(data)
df.sort_values(by=['id', 'parent'], inplace=True)
id parent vehicle color serial
0 1 a car red 324234
4 1 a car red 786
5 1 n hatch purple 34546
8 1 x car red 8376251537
1 2 b car blue 23464
2 3 f truck grey 5667
6 3 f truck grey 8537
3 4 j suv green 1245
7 4 z suv green 111111
我需要的是获取 ID 相同 但 parent 不同 且车辆和颜色相同的所有行。
所以我要:
id parent vehicle color serial
0 1 a car red 324234
4 1 a car red 786
8 1 x car red 8376251537
3 4 j suv green 1245
7 4 z suv green 111111
请注意,我想包括上面的前两个,因为它们有不同的序列号。 编辑: 并且它们是具有不同 parent 和相同 ID 的分组的一部分。
我已经试过了,接近了:
target = df[df.duplicated(['id', 'vehicle', 'color'], keep=False)]
id parent vehicle color serial
0 1 a car red 324234
4 1 a car red 786
8 1 x car red 8376251537
2 3 f truck grey 5667
6 3 f truck grey 8537
3 4 j suv green 1245
7 4 z suv green 111111
但我不希望具有匹配的 id、车辆、颜色 if 对应的 parent 的行也相同。所以在这种情况下,我不想
id parent vehicle color serial
2 3 f truck grey 5667
6 3 f truck grey 8537
因为他们有相同的parent。 我考虑过分组和更改索引,但我正在做的事情不起作用。这似乎是一个简单的问题,也许确实如此,但我就是无法破解它!
IIUC,让我们试试这个:
df[df.groupby(['id','vehicle','color'])['parent'].transform('nunique') > 1]
输出:
id parent vehicle color serial
0 1 a car red 324234
4 1 a car red 786
8 1 x car red 8376251537
3 4 j suv green 1245
7 4 z suv green 111111