来自pandas数据帧的多组重复记录

时间:2018-03-23 19:09:35

标签: python pandas dataframe group-by pandas-groupby

如何从数据框中获取所有现有的重复记录集(基于列)?

我得到了如下数据框:

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)]。记录索引值的元组列表

3 个答案:

答案 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
    ]
}