熊猫,复制名称重复N次的行

时间:2019-10-09 13:41:19

标签: python pandas dataframe

示例数据:

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

4 个答案:

答案 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.mapSeries.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