![](/img/trans.png)
[英]Groupby by a column and select specifc value from other column in pandas dataframe
[英]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.