我是潘达斯的新手,正在做一些练习。
问题是要找出有3种以上类型的项目数量。我很困惑,如何从下面的数据中获取类型(键)。type
列。
另外,Pandas在单列中存储kv对的方法是否正确?谢谢
shopid name type
1 item1 {S: 10, M: 10, L: 10}
2 item2 {S: 10, M: 10}
2 item3 {S: 10, M: 10, L: 10, XL: 10}
3 item1 {S: 10, M: 10, L: 10}
3 item2 {S: 10, M: 10}
4 item3 {S: 10, M: 10, L: 10, XL: 10}
4 item1 {S: 10, M: 10, L: 10}
4 item2 {S: 10, M: 10}
4 item4 {S: 10, M: 10, L: 10, XL: 10, XXL: 10}
预期输出
2
其中项目3和项目4有3种以上的类型
这里还有一种方法,用str访问器看列'type'中的字典,然后用nunique来统计唯一名称的数量。
df.loc[df['type'].str.len() > 3, 'name'].nunique()
输出:
2
IIUC ,考虑到下面是你的数据框架, 。
d = {'shopid': {0: 1, 1: 2, 2: 2, 3: 3, 4: 3, 5: 4, 6: 4, 7: 4, 8: 4},
'name': {0: 'item1',
1: 'item2',
2: 'item3',
3: 'item1',
4: 'item2',
5: 'item3',
6: 'item1',
7: 'item2',
8: 'item4'},
'type': {0: {'S': 10, 'M': 10, 'L': 10},
1: {'S': 10, 'M': 10},
2: {'S': 10, 'M': 10, 'L': 10, 'XL': 10},
3: {'S': '10', 'M': 10, 'L': 10},
4: {'S': 10, 'M': 10},
5: {'S': 10, 'M': 10, 'L': 10, 'XL': 10},
6: {'S': 10, 'M': 10, 'L': 10},
7: {'S': 10, 'M': 10},
8: {'S': 10, 'M': 10, 'L': 10, 'XL': 10, 'XXL': 10}}}
df = pd.DataFrame(d)
你可以将字典列转换为DataFrame,并将其分组在下面的数据框中。shopid
并得到第一个忽略NaN的值,然后在轴上取notna的和=1,然后比较。
output = (pd.DataFrame(df['type'].tolist()).groupby(df['name']).first()
.notna().sum(1).gt(3).sum())
print(output)
#2
看起来你的列 type
不伦不类 dict
但 str
. 不过有一个小技巧你可以试试,通过观察这个数量的 types
实际上等于 :
你有。
df=df[df['type'].str.count(':')>3]
它应该可以帮助你选择有三种以上类型的行.另外,我同意关于数据框架中的数据类型的评论,在一列中把k,v作为dict并不是一个好的选择。
注意:假设你的数据是在一个叫做 "dataframe "的数据框架中。 df
首先,为了您的目的,您可以通过以下方式删除DF中的重复内容。
df.drop_duplicates()
可以选择使用 df.drop_duplicates().reset_index()
然后,你可以通过以下方式添加一个松弛的列。
df['type_count'] = df.apply(lambda r: len(r['type']), axis = 1)
然后你可以紧缩,删除懈怠列,然后像这样找到行数。
print(df[df['type_count']>3].iloc[:,:-1].shape[0])
df[df['type_count']>3]
找到所有项目> 3个字典元素。.iloc[:,:-1]
移除松弛的柱子和 shape[0]
只选择行。
希望能帮到你。