我有一个想要添加行的熊猫DataFrame。 Dataframe看起来像这样:
col1 col2
a 1 5
b 2 6
c 3 7
我想在数据框中添加行,但前提是它们是唯一的。问题是某些新行可能具有相同的索引,但列中的值不同。如果是这种情况,我需要知道。
要添加的一些示例行和所需的结果:
第1行:
col1 col2
a 1 5
所需的第1行结果:未添加 - 它已经在数据框中
第2行:
col1 col2
a 9 9
期望的第2行结果:类似,
print('non-unique entries for index a')
第3行:
col1 col2
d 4 4
所需的第3行结果:只需将行添加到数据框中。
答案 0 :(得分:0)
试试这个:
# existing dataframe == df
# new rows == df_newrows
# dividing newrows dataframe into two, one for repeated indexes, one without.
df_newrows_usable = df_newrows.loc[df_newrows.index.isin(list(df.index.get_values()))==False]
df_newrows_discarded = df_newrows.loc[df_newrows.index.isin(list(df.index.get_values()))]
print ('repeated indexes:', df_newrows_discarded)
# concat df and newrows without repeated indexes
new_df = pd.concat([df,df_newrows],0)
print ('new dataframe:', new_df)
答案 1 :(得分:0)
简单的选项是合并所有行,然后通过数据帧方法保留唯一的行drop_duplicates
但是,当附加重复行时,此选项不会报告警告/错误。
drop_duplicates不考虑索引,因此必须在删除重复项之前重置数据帧,并在之后重新设置:
import pandas as pd
# set up data frame
df = pd.DataFrame({'col1': [1, 2, 3], 'col2':[5, 6, 7]}, index=['a', 'b', 'c'])
# set up row to be appended
row = pd.DataFrame({'col1':[3], 'col2': [7]}, index=['c'])
# append row (don't care if it's duplicate)
df = df.append([row])
# drop duplicatesdf2 = df2.reset_index()
df2 = df2.drop_duplicates()
df2 = df2.set_index('index')
如果警告消息是绝对要求,我们可以编写一个函数来检查行是否通过合并操作重复,并仅在行唯一时附加行。
def append_unique(df, row):
d = df.reset_index()
r = row.reset_index()
if d.merge(r, on=list(d.columns), how='inner').empty:
d2 = d.append(r)
d2 = d2.set_index('index')
return d2
print('non-unique entries for index a')
return df
df2 = append_unique(df2, row)