示例数据:
df1 = pd.DataFrame({
'file': ['file1','file1','file1','file2','file2','file2','file3','file3','file4'],
'prop1': [True,False,True,False,False,False,True,False,False],
'prop2': [False,False,False,False,True,False,False,True,False],
'prop3': [False,True,False,True,False,True,False,False,True]
})
我需要复制其“文件”重复3次的行,以得到如下内容:
file prop1 prop2 prop3
0 file1 True False False
1 file1 False False True
2 file1 True False False
3 file2 False False True
4 file2 False True False
5 file2 False False True
答案 0 :(得分:5)
将GroupBy.transform
用于具有与列相同大小的系列,因此可以通过boolean indexing
进行过滤:
df = df1[df1.groupby('file')['file'].transform('size') == 3]
详细信息:
print (df1.groupby('file')['file'].transform('size'))
0 3
1 3
2 3
3 3
4 3
5 3
6 2
7 2
8 1
Name: file, dtype: int64
或使用filtration
:
df = df1.groupby('file').filter(lambda x: len(x) == 3)
或将Series.map
与Series.value_counts
一起使用:
df = df1[df1['file'].map(df['file'].value_counts()) == 3]
print (df)
file prop1 prop2 prop3
0 file1 True False False
1 file1 False False True
2 file1 True False False
3 file2 False False True
4 file2 False True False
5 file2 False False True
答案 1 :(得分:3)
您可以groupby
的{{1}}名称,用file
进行转换,然后使用结果为数据框建立索引:
size
答案 2 :(得分:2)
IIUC transform
df=df1[df1.groupby('file')['file'].transform('count').eq(3)].copy() # esure you do not have copy warning for future modify .
file prop1 prop2 prop3
0 file1 True False False
1 file1 False False True
2 file1 True False False
3 file2 False False True
4 file2 False True False
5 file2 False False True
答案 3 :(得分:1)
您还可以使用DataFrame.set_index + DataFrame.loc:
new_df=df1.set_index('file').loc[df1.groupby('file').size().eq(3)]
print(new_df)
prop1 prop2 prop3
file
file1 True False False
file1 False False True
file1 True False False
file2 False False True
file2 False True False
file2 False False True