合并DataFrames并丢弃重复值

时间:2015-12-10 09:15:21

标签: numpy pandas data-analysis

我正在收集来自各种文件的时间索引数据,但有时会有一些重叠:

df1 = pd.DataFrame([1, -1, -3], columns=['A'], index=pd.date_range('2000-01-01', periods=3))
df2 = pd.DataFrame([-3, 10, 1], columns=['A'], index=pd.date_range('2000-01-03', periods=3))
pd.concat([df1, df2])

            A
2000-01-01  1
2000-01-02 -1
2000-01-03 -3

             A
2000-01-03  -3
2000-01-04  10
2000-01-05   1

             A
2000-01-01   1
2000-01-02  -1
2000-01-03  -3
2000-01-03  -3
2000-01-04  10
2000-01-05   1

1)如何清理和删除重复的行?(此处为2000-01-03)

2)更一般地说,使用pandas读取和合并多个csv文件比使用手动更快/更聪明的方式:

L=[]
for f in glob.glob('*.csv'):
    L.append(pd.read_csv(f, ...))
fulldata = pd.concat(L)                   # this can be time consuming
fulldata.remove_duplicate_lines()         # this can be time consuming too

2 个答案:

答案 0 :(得分:2)

IIUC你可以做pd.concat然后做drop_duplicates

In [104]: pd.concat([df1, df2]).drop_duplicates()
Out[104]: 
             A
2000-01-01   1
2000-01-02  -1
2000-01-03  -3
2000-01-04  10
2000-01-05   7

修改

你是对的,这种方法不能正常工作,因为它按值而不是按索引下降。对于索引,index可以duplicated

df = pd.concat([df1, df2])
df[~df.index.duplicated()]

In [107]: df[~df.index.duplicated()]
Out[107]: 
             A
2000-01-01   1
2000-01-02  -1
2000-01-03  -3
2000-01-04  10
2000-01-05   1

或者您可以使用第一种方法进行修改,首先需要执行reset_index,然后使用drop_duplicates,但使用subset键的索引值:

 pd.concat([df1, df2]).reset_index().drop_duplicates(subset='index').set_index('index')

In [118]: pd.concat([df1, df2]).reset_index().drop_duplicates(subset='index').set_index('index')
Out[118]: 
             A
index         
2000-01-01   1
2000-01-02  -1
2000-01-03  -3
2000-01-04  10
2000-01-05   1

答案 1 :(得分:2)

如果你喜欢冒险并且决定使用除了Pandas以外的东西来组合CSV,你在使用Awk的机器上,你可以组合各种文件并删除重复项用这个命令:

awk '!arr[$0]++' /path/to/your/files/* > combined_no_dups.csv

然后你可以加载到熊猫......

df = pd.read_csv("combined_no_dups.csv")