如何从数据框中获取所有现有的重复记录集(基于列)?
我得到了如下数据框:
flight_id | from_location | to_location | schedule |
1 | Vancouver | Toronto | 3-Jan |
2 | Amsterdam | Tokyo | 15-Feb |
4 | Fairbanks | Glasgow | 12-Jan |
9 | Halmstad | Athens | 21-Jan |
3 | Brisbane | Lisbon | 4-Feb |
4 | Johannesburg | Venice | 12-Jan |
9 | LosAngeles | Perth | 3-Mar |
这里的flight_id是我需要检查重复项的列。并且有两组重复。
此特定示例的输出应如下所示 - [(2,5),(3,6)]
。记录索引值的元组列表
答案 0 :(得分:8)
使用var test = {a: "v1", b: "v2"};
var part = {...test, a: undefined}
和apply
lambda
或者通过df.groupby('flight_id').apply(
lambda d: tuple(d.index) if len(d.index) > 1 else None
).dropna()
flight_id
4 (2, 5)
9 (3, 6)
dtype: object
对象
groupby
只是元组
{k: tuple(d.index) for k, d in df.groupby('flight_id') if len(d) > 1}
{4: (2, 5), 9: (3, 6)}
留给后人
但我现在非常不喜欢这种方法。这太糟糕了。
我正在弄乱[tuple(d.index) for k, d in df.groupby('flight_id') if len(d) > 1]
[(2, 5), (3, 6)]
其他人可能会觉得这很有趣
itertools.groupby
答案 1 :(得分:7)
这是你需要的吗? public void do(Data someData, BaseInterface interface) {
CastTheBaseInterface obj = (CastTheBaseInterface) interface;
obj.exec(someData);
}
+ duplicated
groupby
在末尾添加(df.loc[df['flight_id'].duplicated(keep=False)].reset_index()).groupby('flight_id')['index'].apply(tuple)
Out[510]:
flight_id
4 (2, 5)
9 (3, 6)
Name: index, dtype: object
tolist
另一种解决方案......仅限有趣
(df.loc[df['flight_id'].duplicated(keep=False)].reset_index()).groupby('flight_id')['index'].apply(tuple).tolist()
Out[511]: [(2, 5), (3, 6)]
答案 2 :(得分:6)
在groupby
上执行df.index
可以带你到位。
v = df.index.to_series().groupby(df.flight_id).apply(pd.Series.tolist)
v[v.str.len().gt(1)]
flight_id
4 [2, 5]
9 [3, 6]
dtype: object
您也可以直接在groupby
上 df.index
变得可爱。
v = pd.Series(df.index.groupby(df.flight_id))
v[v.str.len().gt(1)].to_dict()
{
"4": [
2,
5
],
"9": [
3,
6
]
}