如果值在列表中,则熊猫数据框中的行重复

时间:2019-11-01 13:08:57

标签: python pandas list dataframe

我有一个看起来像这样的数据框:

fruit   cost
apples  2
oranges 3
bananas 5
grapefruit  1

我想传递一个包含指定“水果”列值的列表,并使用该列表复制数据框中的那些行。例如,重复的fruits = ['apples', 'oranges']

然后,应使用额外的一列将这些行复制回数据框中,以表示它们是副本(可以是1/0二进制)。

2 个答案:

答案 0 :(得分:3)

使用Series.isin来获取匹配的行,并使用DataFrame.append来复制原始数据,而使用DataFrame.assign来表示列:

duplicated  = ['apples', 'oranges']
df1 = df[df['fruit'].isin(duplicated)].assign(new=1)
df = df.assign(new=0).append(df1, ignore_index=True)
print (df)
        fruit  cost  new
0      apples     2    0
1     oranges     3    0
2     bananas     5    0
3  grapefruit     1    0
4      apples     2    1
5     oranges     3    1

另一个想法是在concat中使用参数keys-它创建由01填充的新级别,因此必须由第一级别DataFrame.reset_index进行转换此级别的列:

df = (pd.concat([df, df1], keys=(0,1))
       .rename_axis(('new', None))
       .reset_index(level=0)
       .reset_index(drop=True))
print (df)
   new       fruit  cost
0    0      apples     2
1    0     oranges     3
2    0     bananas     5
3    0  grapefruit     1
4    1      apples     2
5    1     oranges     3

答案 1 :(得分:0)

您可以使用concat

result = pd.concat([df, df[df.fruit.isin(fruits)].assign(new=1)], sort=False).fillna(0)

输出

        fruit  cost  new
0      apples     2  0.0
1     oranges     3  0.0
2     bananas     5  0.0
3  grapefruit     1  0.0
0      apples     2  1.0
1     oranges     3  1.0

作为替代方案,您可以在concat之前使用default_value = 0重新编制索引:

filtered = df[df.fruit.isin(fruits)].assign(new=1)

result = pd.concat([df.reindex(columns=filtered.columns, fill_value=0), filtered], sort=False)

print(result)

输出

        fruit  cost  new
0      apples     2    0
1     oranges     3    0
2     bananas     5    0
3  grapefruit     1    0
0      apples     2    1
1     oranges     3    1