我正在尝试选择df
中的行,在每行中,列值的设置大小为> 1;
df = pd.DataFrame({'col': [1, 2, 3],
'a': [41, 4, 5],
'b': [3, 13, 6]})
df['concat'] = (df['a'].astype(str) + df['b'].astype(str))
df.groupby('concat')['col'].apply(set).to_dict()
但这只适用于set
到每个列(' col')值。
python阻止我
df.groupby('concat')['col'].apply(lambda x: set(x) if len(set(x)) > 1).to_dict()
答案 0 :(得分:2)
可以使用str.len
,因为set
是可迭代的:
s = df.groupby('concat')['col'].apply(set)
d = s[s.str.len() > 1].to_dict()
print (d)
{'413': {1, 2}}
答案 1 :(得分:1)
替代方案(不需要apply
)使用groupby.unique
-
v = df.groupby('concat').col.unique()
v[v.str.len() > 1]
concat
413 [1, 2]
Name: col, dtype: object
您可以在此结果上致电to_dict
-
v[v.str.len() > 1].to_dict()
{'413': array([1, 2])}
或者,如果您的最终目标是互联网数据交换,那么直接序列化为JSON -
v[v.str.len() > 1].to_json()
'{"413":[1,2]}'
请注意,数组和集合被隐式序列化为JSON列表对象。
答案 2 :(得分:1)
您可以使用pd.Series.map
:
res = df.groupby('concat')['col'].apply(set)
res_dict = res[res.map(len)>1].to_dict()