繁体   English   中英

仅当其他列值不相同时,如何按一列在熊猫数据框中分组

[英]How to groupby in pandas dataframe by one column only if other column value is not same

我有一个数据框,如下所示:

df
     ID  first    last
0   123    Joe  Thomas
1   456  James   Jonas
2   675  James   Jonas
3   457  James  Thomas

我想要的输出如下:

{'Thomas': [123, 457], 'James':[675, 457]} 

这样,对于'last'相同但'first'不同的所有行,或'first'相同但'last'不同的所有行,请获取这些ID。

我正在尝试这样做,如下所示:

    for i in zip(df['ID'], df['first'], df['last']):
...     last.setdefault(i[2],[])
...     first.setdefault(i[1],[])
...     last[i[2]].append(i[0])
...     first[i[1]].append(i[0])

与我得到的输出为:

>>> first
{'James': [456, 675, 457], 'Joe': [123]}
>>> last
{'Thomas': [123, 457], 'Jonas': [456, 675]}

但这仅按“第一个”或“最后一个”分组,并且不会检查另一个不应相同。 如何获得所需的输出?

更新:

删除重复项为:

df = df.drop_duplicates(subset=['first', 'last'], take_last=False)

回答:

用这种方式做到了。 不知道这是否正确。 有什么建议么?

new_d = pd.melt(df.sort_values('ID').drop_duplicates(['first','last']),'ID').groupby('value').ID.apply(list).to_dict()

low_d = {k:v for k, v in new_d.items() if len(v)!=1}

基于@Abdou在注释中提供的答案,我可以确认这在使用Pandas 0.20.1版的Python 2.7.13版本中以及在使用Pandas 0.20.3版的Python 3.6.2版本中有效:

from __future__ import division, print_function
import pandas as pd
import sys


def main():

    print("python version is: %s" % sys.version)
    print("pandas version: %s" % pd.__version__)

    df = pd.DataFrame(data={'first': ['Joe','James','James','James'],
                            'last': ['Thomas','Jonas','Jonas','Thomas'],
                            'ID': [123, 456, 675, 457]})

    grouped = df.groupby('first')\
                .apply(lambda x: x.drop_duplicates(['last'], keep='last'))

    melted = pd.melt(grouped, 'ID', ['first', 'last'], 'denoms', 'names')

    result = melted[melted.names.duplicated(keep=False)]\
                .groupby('names')['ID']

    print(result.apply(list).to_dict())

if __name__ == "__main__":
    main()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM