合并 DataFrame 并丢弃重复值
Merge DataFrames and discard duplicates values
我正在收集来自各种文件的时间索引数据,但有时会有一些重叠:
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
IIUC 你可以做到 pd.concat
and then do 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
编辑
你是对的,该方法不能正常工作,因为它按值而不是按索引下降。对于索引,您可以 duplicated
for index
:
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
如果您喜欢冒险并决定使用 Pandas 以外的东西来组合 CSV, 和 您在一台装有 Awk 的机器上,您可以组合各种文件并使用这个命令删除重复项:
awk '!arr[[=10=]]++' /path/to/your/files/* > combined_no_dups.csv
然后您可以将其加载到 pandas...
df = pd.read_csv("combined_no_dups.csv")
我正在收集来自各种文件的时间索引数据,但有时会有一些重叠:
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
IIUC 你可以做到 pd.concat
and then do 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
编辑
你是对的,该方法不能正常工作,因为它按值而不是按索引下降。对于索引,您可以 duplicated
for index
:
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
如果您喜欢冒险并决定使用 Pandas 以外的东西来组合 CSV, 和 您在一台装有 Awk 的机器上,您可以组合各种文件并使用这个命令删除重复项:
awk '!arr[[=10=]]++' /path/to/your/files/* > combined_no_dups.csv
然后您可以将其加载到 pandas...
df = pd.read_csv("combined_no_dups.csv")