Numpy 合并数据帧并放弃重复的值

Numpy 合并数据帧并放弃重复的值,numpy,pandas,data-analysis,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])

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

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你可以做,然后做:

编辑

您是对的,该方法不能正常工作,因为它是按值而不是按索引进行删除的。对于索引,您可以为
索引

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
或者您可以使用第1种方法进行修改,首先需要执行
重置索引
,然后使用
删除重复项
,但对于具有
子集
键的索引值:

 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
IIUC你可以做,然后做:

编辑

您是对的,该方法不能正常工作,因为它是按值而不是按索引进行删除的。对于索引,您可以为
索引

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
或者您可以使用第1种方法进行修改,首先需要执行
重置索引
,然后使用
删除重复项
,但对于具有
子集
键的索引值:

 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[$0]++' /path/to/your/files/* > combined_no_dups.csv
然后你可以把它装到熊猫身上

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

如果您有冒险精神,决定使用Pandas以外的其他工具来组合CSV,并且您在一台带有Awk的机器上,您可以使用以下单个命令组合各种文件并删除重复文件:

awk '!arr[$0]++' /path/to/your/files/* > combined_no_dups.csv
然后你可以把它装到熊猫身上

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

您可以使用
pd.concat(L,axis=1)
@EdChum我尝试了
axis=1
,但是我突然得到了一个3列的表(索引+a+a),还有很多NaN值。对2有什么想法吗?)抱歉,请尝试一下pd.concat(L)
,如果可能的话,如果它给出一个issue@EdChum我做到了:看我的问题,第三个输出是
pd.concat([df1,df2])
你可以做
pd.concat([df1,df2])。删除重复项()。你是在寻找只使用一个命令的解决方案吗?你可以使用
pd.concat(L,axis=1)
@EdChum我尝试了
axis=1
,但我突然得到了一个3列的表(再次索引+a+a)和许多NaN值。对2有什么想法吗?)抱歉,请尝试一下pd.concat(L)
,如果可能的话,如果它给出一个issue@EdChum我做到了:看我的问题,第三个输出是
pd.concat([df1,df2])
你可以做
pd.concat([df1,df2])。删除重复项()。您正在寻找只使用一个命令的解决方案吗?谢谢!对于问题#2,您会使用
glob.glob('*.csv')
对所有.csv文件进行循环,还是使用pandas有一种简单的方法从多个文件加载数据?@Basj我认为,如果不进行循环,您无法做到这一点。查看问题警告的答案!我刚刚注意到
删除重复项
不起作用:它还会删除我(更新)问题中的2000-01-05!它在值中查找重复项,而我说的是索引中的重复项。谢谢!对于问题#2,您会使用
glob.glob('*.csv')
对所有.csv文件进行循环,还是使用pandas有一种简单的方法从多个文件加载数据?@Basj我认为,如果不进行循环,您无法做到这一点。查看问题警告的答案!我刚刚注意到
删除重复项
不起作用:它还会删除我(更新)问题中的2000-01-05!它在值中查找重复项,而我说的是索引中的重复项。