[英]Find matching rows based on a conditional grouping in a pandas dataframe
我到處尋找這個答案,但似乎沒有人做我需要的。 這是我需要的一個虛擬例子:
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是相同的但是父級不同 ,車輛和顏色是相同的。
所以我想:
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
請注意,我想要包含上面的前兩個,因為它們具有不同的序列號。 編輯:它們是具有不同父級w /相同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,車輛,顏色i 的相應父級的行也是相同的 。 所以在這種情況下,我不想要
id parent vehicle color serial
2 3 f truck grey 5667
6 3 f truck grey 8537
因為他們有同一個父母。 我已經考慮過分組和更改索引,但我正在做的事情不起作用。 這似乎是一個簡單的問題,也許是,但我只是不能破解它!
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.