我在列表中有很多类别的项目,如下所示:
largedf = pd.DataFrame({'arow': ['row1', 'row2', 'row3', 'row4'], 'green': ['a', 'b', 'b', 'a'], 'red': ['a', 'b', 'b', 'a'],
'cat': ['b', 'a', 'b', 'a'], 'dog': ['b', 'a', 'b', 'a']})
arow cat dog green red
0 row1 b b b a
1 row2 a a b b
2 row3 b b b b
3 row4 a a a a
我有一个大型数据框,其中包含类别中的所有项目:
a
我只想保存row3
是某个类别的值且仅包含该类别的行。我不会保存b
,因为所有商品都有row4
,a
将无法保存,因为所有商品都有row1
。
a
会被保存,因为它red
b
(即使绿色有a
,至少有row2
个那个类别)。
a
将被保存,因为cat/dog
中至少有一个a
(在这种情况下,两者中都有a
)。
对于每个已保存的行,我想要一个列,其中列出了a
的类别以及该类别中shorterdf = pd.DataFrame({'arow': ['row1', 'row2'], 'green': ['a', 'b'], 'red': ['a', 'b'], 'cat': ['b', 'a'], 'dog': ['b', 'a']})
arow cat dog green red category percent
0 row1 b b b a colors 0.5
1 row2 a a b b animals 1
的百分比(请参阅下面的输出)。
validators=[
FileValidator(
allowed_extensions=ALLOWED_PHOTO_EXT,
allowed_mimetypes=ALLOWED_PHOTO_MIME_TYPES,
max_size=ALLOWED_PHOTO_MAX_SIZE,
)
],
答案 0 :(得分:2)
我们使用nunique来过滤掉我们需要的行
t=largedf[largedf.iloc[:,1:].nunique(1).gt(1)]
t=t.set_index('arow')
s=t.copy()
然后我们使用map
s.columns=s.columns.map(dict(zip(s.columns,np.repeat(['animals','color'],2))).get)
# get the percentage and the category accordingly
s1=(s.eq('a').groupby(level=0,axis=1).sum()/2).stack()
# concat together
pd.concat([t,s1[s1!=0].reset_index(level=1)],axis=1).rename(columns={'level_1':'category',0:'percent'})
Out[287]:
cat dog green red category percent
arow
row1 b b a a color 1.0
row2 a a b b animals 1.0
答案 1 :(得分:1)
创建一个方便的字典,用于重命名现有数据框的列
m = {k: (v, k) for k, v in {
**dict.fromkeys(colors, 'colors'),
**dict.fromkeys(animals, 'animals')
}.items()}
largedf[
largedf.drop('arow', 1)
.rename(columns=m.get)
.eq('a').any(axis=1, level=0).sum(1).eq(1)
]
arow cat dog green red
0 row1 b b a a
1 row2 a a b b
df = largedf.drop('arow', 1).rename(columns=m.get)
df
animals colors
cat dog green red
0 b b a a
1 a a b b
2 b b b b
3 a a a a
df.eq('a')
animals colors
cat dog green red
0 False False True True
1 True True False False
2 False False False False
3 True True True True
df.eq('a').any(axis=1, level=0)
animals colors
0 False True
1 True False
2 False False
3 True True
df.eq('a').any(axis=1, level=0).sum(1).eq(1)
0 True
1 True
2 False
3 False
dtype: bool