下面是我的数据集示例;
name status
google Active
Facebook Active
Tex Active
Tex WUP
Yout Active
我正在尝试基于名称计数(= 1和> 1)创建两个DataFrames
编写的代码:
#single occurance DatFrame
df_single=pd.concat(g for _, g in df.groupby("name") if len(g) == 1)
#Multi Occurance DataFrame
df_multi=pd.concat(g for _, g in df.groupby("name") if len(g) > 1)
问题是当我有这样的数据
name status
google Active
Facebook Active
Tex Active
df_multi=pd.concat(g for _, g in df.groupby("name") if len(g) > 1) fails
此操作失败,表示没有数据可合并。我可以在concat之前检查组是否存在吗?
答案 0 :(得分:2)
我建议使用另一种解决方案-GroupBy.transform
用于Series
,其大小与原始DataFrame
相同,因此可以通过boolean indexing
进行过滤:
s = df.groupby("name")['name'].transform('size')
print (s)
0 1
1 1
2 2
3 2
4 1
Name: name, dtype: int64
df_single = df[s == 1]
df_multi = df[s > 1]
如果只想按重复项过滤,则用Series.duplicated
创建布尔掩码:
m = df['name'].duplicated(keep=False)
print (m)
0 False
1 False
2 True
3 True
4 False
Name: name, dtype: bool
df_single = df[~m]
df_multi = df[m]
print (df_single)
name status
0 google Active
1 Facebook Active
4 Yout Active
print (df_multi)
name status
2 Tex Active
3 Tex WUP