pandas在列值上应用lambda并选择其设置大小为>的值。 1

时间:2018-04-20 10:58:18

标签: python pandas dataframe

我正在尝试选择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()    

3 个答案:

答案 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()