如何在python中找到列和索引完全相同但值不同的数据帧列表的交集?

如何在python中找到列和索引完全相同但值不同的数据帧列表的交集?,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个熊猫数据帧列表,如下所示: lis = [df1, df2, df3, ... , dfn] 我想找到这些数据帧的一个交集,这样我的最终df调用 交叉点_df只有对所有人通用的值。所有列和行仍应存在,但如果未找到交点,则应使用na填充 我的数据帧都是多维的,行数和列数相同,如下所示: 1 2 3 4 5 cat cat 1 0 0 1 1 dog 1 0 0 1 1

我有一个熊猫数据帧列表,如下所示:

lis = [df1, df2, df3, ... , dfn]
我想找到这些数据帧的一个交集,这样我的最终df调用 交叉点_df只有对所有人通用的值。所有列和行仍应存在,但如果未找到交点,则应使用na填充

我的数据帧都是多维的,行数和列数相同,如下所示:

              1   2   3   4   5  
cat   cat     1   0   0   1   1  
      dog     1   0   0   1   1  
      fox     0   0   0   0   0  
      jumps   0   0   1   1   1  
      over    1   0   0   1   1  
      the     1   0   0   1   1
dog   cat     1   0   0   1   0  
      dog     1   0   0   1   0  
      fox     0   0   0   0   0  
      jumps   1   0   0   1   0  
      over    1   0   0   1   0  
      the     1   1   0   1   0 
我在stackoverflow上尝试了不同的解决方案,但运气不佳,有什么想法吗?

看看这是否有效

from functools import reduce
import pandas as pd

lis = [df1, df2, df3, ... , dfn]

inner_align = lambda d1, d2: d1.align(d2, 'inner')[0]
outer_align = lambda d1, d2: d1.align(d2, 'outer')[0]

inner_indcs = reduce(inner_align, lis)
outer_indcs = reduce(outer_aling, lis)

innout = lambda d, i, o: d.reindex_like(i).reindex_like(o)

output = innout(lis[0], inner_indcs, outer_indcs)

设置

lis = [
    pd.DataFrame(1, list('abc'), list('xyz')),
    pd.DataFrame(1, list('acd'), list('wyz')),
    pd.DataFrame(1, list('bec'), list('ysu')),
    pd.DataFrame(1, list('cef'), list('xgy')),
]

print(*lis, sep='\n'*2)

   x  y  z
a  1  1  1
b  1  1  1
c  1  1  1

   w  y  z
a  1  1  1
c  1  1  1
d  1  1  1

   y  s  u
b  1  1  1
e  1  1  1
c  1  1  1

   x  g  y
c  1  1  1
e  1  1  1
f  1  1  1
from functools import reduce
import pandas as pd

inner_align = lambda d1, d2: d1.align(d2, 'inner')[0]
outer_align = lambda d1, d2: d1.align(d2, 'outer')[0]

inner_indcs = reduce(inner_align, lis)
outer_indcs = reduce(outer_align, lis)

innout = lambda d, i, o: d.reindex_like(i).reindex_like(o)

output = innout(lis[0], inner_indcs, outer_indcs)

print(output)

    g   s   u   w   x    y   z
a NaN NaN NaN NaN NaN  NaN NaN
b NaN NaN NaN NaN NaN  NaN NaN
c NaN NaN NaN NaN NaN  1.0 NaN
d NaN NaN NaN NaN NaN  NaN NaN
e NaN NaN NaN NaN NaN  NaN NaN
f NaN NaN NaN NaN NaN  NaN NaN

演示

lis = [
    pd.DataFrame(1, list('abc'), list('xyz')),
    pd.DataFrame(1, list('acd'), list('wyz')),
    pd.DataFrame(1, list('bec'), list('ysu')),
    pd.DataFrame(1, list('cef'), list('xgy')),
]

print(*lis, sep='\n'*2)

   x  y  z
a  1  1  1
b  1  1  1
c  1  1  1

   w  y  z
a  1  1  1
c  1  1  1
d  1  1  1

   y  s  u
b  1  1  1
e  1  1  1
c  1  1  1

   x  g  y
c  1  1  1
e  1  1  1
f  1  1  1
from functools import reduce
import pandas as pd

inner_align = lambda d1, d2: d1.align(d2, 'inner')[0]
outer_align = lambda d1, d2: d1.align(d2, 'outer')[0]

inner_indcs = reduce(inner_align, lis)
outer_indcs = reduce(outer_align, lis)

innout = lambda d, i, o: d.reindex_like(i).reindex_like(o)

output = innout(lis[0], inner_indcs, outer_indcs)

print(output)

    g   s   u   w   x    y   z
a NaN NaN NaN NaN NaN  NaN NaN
b NaN NaN NaN NaN NaN  NaN NaN
c NaN NaN NaN NaN NaN  1.0 NaN
d NaN NaN NaN NaN NaN  NaN NaN
e NaN NaN NaN NaN NaN  NaN NaN
f NaN NaN NaN NaN NaN  NaN NaN

这看起来不错,但最终产品应该是单个数据帧,而不是相同数据帧的列表。@Elisha512我很高兴这很有帮助。。。但是如果你不给我们看,我怎么知道你的最终输出应该是什么样的呢。首先,我不得不猜测如何创建样本数据。你为什么不拿我的样本数据来编辑你的帖子呢。包括您希望最终数据帧的外观。您的示例中有多少个数据帧?我不太明白这个问题formatting@Blake谢谢你的编辑。你可能是对的,但你猜的和我一样。不过,我更喜欢你的猜测(-: