Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 比较两个不同大小的数据帧中的每个元素,并在其中添加或删除单词_Python_String_Pandas_Dataframe - Fatal编程技术网

Python 比较两个不同大小的数据帧中的每个元素,并在其中添加或删除单词

Python 比较两个不同大小的数据帧中的每个元素,并在其中添加或删除单词,python,string,pandas,dataframe,Python,String,Pandas,Dataframe,我有一个关于熊猫数据帧操作的问题 假设我有两个不同大小的数据帧(它们的行数相同,但列的大小不同) a =pd.DataFrame({"code1":['A','B','C','D'],"code2":['E','F','G','H']}) b= pd.DataFrame({"code1":['A1','B','C','D'],"code2":['E','F','G','N'],"code3":['A2','L','M','']}) 对于可视化: a: code1 code2 0 A

我有一个关于熊猫数据帧操作的问题

假设我有两个不同大小的数据帧(它们的行数相同,但列的大小不同)

a =pd.DataFrame({"code1":['A','B','C','D'],"code2":['E','F','G','H']})
b= pd.DataFrame({"code1":['A1','B','C','D'],"code2":['E','F','G','N'],"code3":['A2','L','M','']}) 
对于可视化:

a: code1 code2
0     A     E
1     B     F
2     C     G
3     D     H
b: code1 code2 code3
0    A1     E     A2 
1     B     F     L
2     C     G     M
3     D     N      
我的理想输出是有一个数据帧“c”,表示:

c: addedword  deletedword
0   A1,A2      A
1   L
2   M
3   N          H
基本上,我希望将“a”中的每一行与“b”中的对应行进行比较。然后比较每个元素,以便如果有添加的字符串或删除的字符串,则显示到新的数据帧。

使用设置差异

g = lambda x: map(set, x.values)          # converts 2-D array to sets
f = lambda t: (t[1] - t[0], t[0] - t[1])  # t will be a tuple of sets
h = lambda y: map(','.join, y)            # stitch sets back together
pd.DataFrame(
    list(map(h, map(f, zip(*map(g, (a, b)))))),
    columns=['Added', 'Deleted']
)

   Added Deleted
0  A1,A2       A
1      L        
2      M        
3     ,N       H

使用
np.inad

pd.DataFrame({'addedword':[b.values[i][~np.in1d(b.values[i] ,a.values[i])]  for i in range(len(a))],'deletedword':[a.values[i][~np.in1d(a.values[i] ,b.values[i])]  for i in range(len(a))]})
Out[176]: 
  addedword deletedword
0  [A1, A2]         [A]
1       [L]          []
2       [M]          []
3     [N, ]         [H]

使用
设置
应用
映射
,步骤简单:

为两个数据帧创建一组每行:

aset = a.apply(set, axis=1)
print(aset)
bset = b.apply(set, axis=1)
print(bset)
输出:

0    {A, E}
1    {F, B}
2    {C, G}
3    {H, D}
dtype: object
0    {E, A1, A2}
1      {F, L, B}
2      {C, M, G}
3       {, D, N}
dtype: object
0    A
1     
2     
3    H
dtype: object
0    A1,A2
1        L
2        M
3       ,N
dtype: object
创建上述集合之间关联差异的列表:

deletedword = pd.Series(map(lambda x: ",".join(x), aset - bset))
print(deletedword)
addedword = pd.Series(map(lambda x: ",".join(x), bset - aset))
print(addedword)
输出:

0    {A, E}
1    {F, B}
2    {C, G}
3    {H, D}
dtype: object
0    {E, A1, A2}
1      {F, L, B}
2      {C, M, G}
3       {, D, N}
dtype: object
0    A
1     
2     
3    H
dtype: object
0    A1,A2
1        L
2        M
3       ,N
dtype: object
最后,从以下列表中创建一个数据帧:

outdf = pd.DataFrame({"addedword":addedword, "deletedword":deletedword})
print(outdf)
输出:

  addedword deletedword
0     A2,A1           A
1         L            
2         M            
3        ,N           H

很高兴看到你回来:-)你好,文。我的参与程度仍有疑问(-: