我有一个看起来像这样的数据框:
fruit cost
apples 2
oranges 3
bananas 5
grapefruit 1
我想传递一个包含指定“水果”列值的列表,并使用该列表复制数据框中的那些行。例如,重复的fruits = ['apples', 'oranges']
。
然后,应使用额外的一列将这些行复制回数据框中,以表示它们是副本(可以是1/0二进制)。
答案 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
-它创建由0
和1
填充的新级别,因此必须由第一级别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